Examples

Real OCF documents, from a fully-annotated set play to a minimal quick-mode sketch. Each one validates against the current JSON Schema.

3-Man Weave

Classic 3-player weave from full court. Players pass and follow their pass, weaving across the court to finish at the basket.

{
  "$schema": "https://opencoachingformat.org/schema/v1.json",
  "meta": {
    "id": "a3c2e1d0-9b8f-4a7e-b6c5-1d2e3f4a5b6c",
    "title": "3-Man Weave",
    "description": "Classic 3-player weave from full court. Players pass and follow their pass, weaving across the court to finish at the basket.",
    "author": "OCF Examples",
    "tags": [
      "passing",
      "transition",
      "full-court",
      "3-player",
      "beginner",
      "conditioning"
    ],
    "difficulty": "beginner",
    "created": "2025-02-27T10:00:00Z",
    "source_format": "open"
  },
  "court": {
    "ruleset": "fiba",
    "type": "full_court",
    "drill_focus": "offense"
  },
  "entities": [
    {
      "type": "offense",
      "nr": 1,
      "x": 0,
      "y": -14
    },
    {
      "type": "offense",
      "nr": 2,
      "x": -5,
      "y": -14
    },
    {
      "type": "offense",
      "nr": 3,
      "x": 5,
      "y": -14
    }
  ],
  "balls": [
    {
      "id": "ball_1",
      "carried_by": "offense_1"
    }
  ],
  "frames": [
    {
      "id": "frame_1",
      "label": "Start",
      "description": "offense_1 passes to offense_2 and follows the pass, cutting behind offense_2.",
      "duration_ms": 1500,
      "actions": [
        {
          "player": "offense_1",
          "type": "pass",
          "to_player": "offense_2",
          "ball_id": "ball_1",
          "variant": "chest"
        },
        {
          "player": "offense_1",
          "type": "cut",
          "moves": [
            {
              "to": {
                "x": -3,
                "y": -11
              }
            }
          ],
          "after": "offense_1.pass"
        }
      ],
      "end_state": {
        "offense_1": {
          "x": -3,
          "y": -11
        },
        "offense_2": {
          "x": -5,
          "y": -14
        },
        "offense_3": {
          "x": 5,
          "y": -14
        },
        "balls": {
          "ball_1": {
            "carried_by": "offense_2"
          }
        }
      }
    },
    {
      "id": "frame_2",
      "label": "First Exchange",
      "description": "offense_2 dribbles to the middle and passes to offense_3, then follows the pass.",
      "duration_ms": 2000,
      "actions": [
        {
          "player": "offense_2",
          "type": "dribble",
          "ball_id": "ball_1",
          "moves": [
            {
              "to": {
                "x": 0,
                "y": -8
              }
            }
          ]
        },
        {
          "player": "offense_2",
          "type": "pass",
          "to_player": "offense_3",
          "ball_id": "ball_1",
          "variant": "chest",
          "after": "offense_2.dribble"
        },
        {
          "player": "offense_2",
          "type": "cut",
          "moves": [
            {
              "to": {
                "x": 3.5,
                "y": -4
              }
            }
          ],
          "after": "offense_2.pass"
        },
        {
          "player": "offense_1",
          "type": "move",
          "moves": [
            {
              "to": {
                "x": -5,
                "y": -8
              }
            }
          ]
        }
      ],
      "end_state": {
        "offense_1": {
          "x": -5,
          "y": -8
        },
        "offense_2": {
          "x": 3.5,
          "y": -4
        },
        "offense_3": {
          "x": 5,
          "y": -8
        },
        "balls": {
          "ball_1": {
            "carried_by": "offense_3"
          }
        }
      }
    },
    {
      "id": "frame_3",
      "label": "Second Exchange",
      "description": "offense_3 dribbles toward the middle and passes to offense_1 cutting from the left, then follows.",
      "duration_ms": 2000,
      "actions": [
        {
          "player": "offense_3",
          "type": "dribble",
          "ball_id": "ball_1",
          "moves": [
            {
              "to": {
                "x": 0,
                "y": 0
              }
            }
          ]
        },
        {
          "player": "offense_3",
          "type": "pass",
          "to_player": "offense_1",
          "ball_id": "ball_1",
          "variant": "chest",
          "after": "offense_3.dribble"
        },
        {
          "player": "offense_3",
          "type": "cut",
          "moves": [
            {
              "to": {
                "x": -3,
                "y": 5
              }
            }
          ],
          "after": "offense_3.pass"
        },
        {
          "player": "offense_1",
          "type": "move",
          "moves": [
            {
              "to": {
                "x": -5,
                "y": 0
              }
            }
          ]
        },
        {
          "player": "offense_2",
          "type": "move",
          "moves": [
            {
              "to": {
                "x": 5,
                "y": 0
              }
            }
          ]
        }
      ],
      "end_state": {
        "offense_1": {
          "x": -5,
          "y": 0
        },
        "offense_2": {
          "x": 5,
          "y": 0
        },
        "offense_3": {
          "x": -3,
          "y": 5
        },
        "balls": {
          "ball_1": {
            "carried_by": "offense_1"
          }
        }
      }
    },
    {
      "id": "frame_4",
      "label": "Finish",
      "description": "offense_1 attacks the basket for the layup. offense_2 fills the right wing as the kick-out option.",
      "duration_ms": 2000,
      "actions": [
        {
          "player": "offense_1",
          "type": "dribble",
          "ball_id": "ball_1",
          "moves": [
            {
              "variant": "speed",
              "to": {
                "named": "basket"
              }
            }
          ]
        },
        {
          "player": "offense_1",
          "type": "shoot",
          "ball_id": "ball_1",
          "variant": "layup",
          "result": "make",
          "after": "offense_1.dribble"
        },
        {
          "player": "offense_2",
          "type": "move",
          "moves": [
            {
              "to": {
                "named": "right_wing"
              }
            }
          ]
        }
      ],
      "end_state": {
        "offense_1": {
          "named": "basket"
        },
        "offense_2": {
          "named": "right_wing"
        },
        "balls": {
          "ball_1": {
            "dead": true
          }
        }
      }
    }
  ]
}

Basic Pick & Roll

Ball handler uses a ball screen at the top of the key. Screener rolls to the basket for the finish.

{
  "$schema": "https://opencoachingformat.org/schema/v1.json",
  "meta": {
    "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "title": "Basic Pick & Roll",
    "description": "Ball handler uses a ball screen at the top of the key. Screener rolls to the basket for the finish.",
    "author": "OCF Examples",
    "tags": [
      "pick-and-roll",
      "offense",
      "half-court",
      "2-player",
      "beginner"
    ],
    "difficulty": "beginner",
    "created": "2025-02-27T10:00:00Z",
    "source_format": "open"
  },
  "court": {
    "ruleset": "fiba",
    "type": "half_court",
    "drill_focus": "offense"
  },
  "entities": [
    {
      "type": "offense",
      "nr": 1,
      "x": 0,
      "y": 5.68
    },
    {
      "type": "offense",
      "nr": 4,
      "x": -2.45,
      "y": 8.2
    },
    {
      "type": "defense",
      "nr": 1,
      "x": 0.5,
      "y": 5.2
    },
    {
      "type": "defense",
      "nr": 4,
      "x": -2.8,
      "y": 7.8
    }
  ],
  "balls": [
    {
      "id": "ball_1",
      "carried_by": "offense_1"
    }
  ],
  "frames": [
    {
      "id": "frame_1",
      "label": "Step 1 — Screen",
      "description": "offense_4 moves up from the left elbow to set a ball screen for offense_1 at the top of the key.",
      "duration_ms": 1500,
      "actions": [
        {
          "player": "offense_4",
          "type": "screen",
          "for_player": "offense_1",
          "on_player": "defense_1",
          "variant": "ball_screen",
          "at": {
            "x": -0.5,
            "y": 6.7
          },
          "physicality": "hard"
        }
      ],
      "end_state": {
        "offense_1": {
          "named": "top_of_the_key"
        },
        "offense_4": {
          "x": -0.5,
          "y": 6.2
        },
        "balls": {
          "ball_1": {
            "carried_by": "offense_1"
          }
        }
      }
    },
    {
      "id": "frame_2",
      "label": "Step 2 — Attack",
      "description": "offense_1 uses the screen and dribbles hard left toward the elbow; offense_4 rolls to the right block.",
      "duration_ms": 2000,
      "actions": [
        {
          "player": "offense_1",
          "type": "dribble",
          "ball_id": "ball_1",
          "intensity": "normal",
          "moves": [
            {
              "variant": "hesitation"
            },
            {
              "variant": "speed",
              "to": {
                "named": "left_elbow"
              },
              "around_player": "defense_1",
              "intensity": "explosive"
            }
          ]
        },
        {
          "player": "offense_4",
          "type": "cut",
          "variant": "basket",
          "intensity": "fast",
          "moves": [
            {
              "to": {
                "named": "right_block"
              }
            }
          ],
          "tags": [
            "roll"
          ]
        }
      ],
      "end_state": {
        "offense_1": {
          "named": "left_elbow"
        },
        "offense_4": {
          "named": "right_block"
        },
        "balls": {
          "ball_1": {
            "carried_by": "offense_1"
          }
        }
      }
    },
    {
      "id": "frame_3",
      "label": "Step 3 — Finish",
      "description": "offense_1 throws a bounce pass to the rolling offense_4, who finishes with a layup.",
      "duration_ms": 1500,
      "actions": [
        {
          "player": "offense_1",
          "type": "pass",
          "to_player": "offense_4",
          "ball_id": "ball_1",
          "variant": "bounce",
          "intensity": "hard"
        },
        {
          "player": "offense_4",
          "type": "shoot",
          "ball_id": "ball_1",
          "variant": "layup",
          "result": "make",
          "on_catch": true,
          "intensity": "soft"
        }
      ],
      "end_state": {
        "offense_1": {
          "named": "left_elbow"
        },
        "offense_4": {
          "named": "right_block"
        },
        "balls": {
          "ball_1": {
            "dead": true
          }
        }
      }
    }
  ],
  "areas": [
    {
      "form": "rectangle",
      "color": "yellow",
      "opacity": 0.2,
      "x": 0,
      "y": 10.5,
      "width": 4.9,
      "height": 4,
      "rotation": 0
    }
  ],
  "labels": [
    {
      "text": "Roll!",
      "x": 3.2,
      "y": 9.5,
      "color": "black"
    }
  ]
}

Quick Sketch — Give and Go

Minimal example: a coach sketches a give-and-go without any detail annotations.

{
  "$schema": "https://opencoachingformat.org/schema/v1.json",
  "meta": {
    "id": "b1e2d3c4-5f6a-4b7c-8d9e-0f1a2b3c4d5e",
    "title": "Quick Sketch — Give and Go",
    "description": "Minimal example: a coach sketches a give-and-go without any detail annotations.",
    "author": "OCF Examples",
    "tags": [
      "quick-mode",
      "give-and-go"
    ],
    "source_format": "open"
  },
  "court": {
    "ruleset": "fiba",
    "type": "half_court"
  },
  "entities": [
    {
      "type": "offense",
      "nr": 1,
      "x": -3,
      "y": 6
    },
    {
      "type": "offense",
      "nr": 2,
      "x": 3,
      "y": 6
    }
  ],
  "balls": [
    {
      "id": "ball_1",
      "carried_by": "offense_1"
    }
  ],
  "frames": [
    {
      "id": "frame_1",
      "actions": [
        {
          "player": "offense_1",
          "type": "pass",
          "to_player": "offense_2"
        },
        {
          "player": "offense_1",
          "type": "cut",
          "moves": [
            {
              "to": {
                "named": "basket"
              }
            }
          ]
        }
      ],
      "end_state": {
        "offense_1": {
          "named": "basket"
        },
        "balls": {
          "ball_1": {
            "carried_by": "offense_2"
          }
        }
      }
    },
    {
      "id": "frame_2",
      "actions": [
        {
          "player": "offense_2",
          "type": "pass",
          "to_player": "offense_1"
        },
        {
          "player": "offense_1",
          "type": "shoot"
        }
      ],
      "end_state": {
        "balls": {
          "ball_1": {
            "dead": true
          }
        }
      }
    }
  ]
}

3v2 Transition

Three offensive players attack two defenders in transition and create a quality shot through ball movement and spacing.

{
  "$schema": "https://opencoachingformat.org/schema/v1.json",
  "meta": {
    "id": "c9d8e7f6-5a4b-3c2d-1e0f-9a8b7c6d5e4f",
    "title": "3v2 Transition",
    "description": "Three offensive players attack two defenders in transition and create a quality shot through ball movement and spacing.",
    "author": "OCF Examples",
    "tags": [
      "transition",
      "3v2",
      "full-court",
      "offense",
      "intermediate"
    ],
    "difficulty": "intermediate",
    "created": "2025-02-27T10:00:00Z",
    "source_format": "open"
  },
  "court": {
    "ruleset": "fiba",
    "type": "full_court",
    "drill_focus": "transition"
  },
  "entities": [
    {
      "type": "offense",
      "nr": 1,
      "x": 0,
      "y": -12
    },
    {
      "type": "offense",
      "nr": 2,
      "x": -4,
      "y": -10
    },
    {
      "type": "offense",
      "nr": 3,
      "x": 4,
      "y": -10
    },
    {
      "type": "defense",
      "nr": 1,
      "x": -2,
      "y": 2
    },
    {
      "type": "defense",
      "nr": 2,
      "x": 2,
      "y": 2
    }
  ],
  "balls": [
    {
      "id": "ball_1",
      "carried_by": "offense_1"
    }
  ],
  "frames": [
    {
      "id": "frame_1",
      "label": "Push",
      "description": "offense_1 pushes the ball up the middle; offense_2 and offense_3 fill the wings at full speed.",
      "duration_ms": 2000,
      "actions": [
        {
          "player": "offense_1",
          "type": "dribble",
          "ball_id": "ball_1",
          "moves": [
            {
              "variant": "speed",
              "to": {
                "x": 0,
                "y": 1
              }
            }
          ]
        },
        {
          "player": "offense_2",
          "type": "move",
          "moves": [
            {
              "to": {
                "named": "left_wing"
              }
            }
          ]
        },
        {
          "player": "offense_3",
          "type": "move",
          "moves": [
            {
              "to": {
                "named": "right_wing"
              }
            }
          ]
        }
      ],
      "end_state": {
        "offense_1": {
          "x": 0,
          "y": 1
        },
        "offense_2": {
          "named": "left_wing"
        },
        "offense_3": {
          "named": "right_wing"
        },
        "balls": {
          "ball_1": {
            "carried_by": "offense_1"
          }
        }
      }
    },
    {
      "id": "frame_2",
      "label": "Draw and Kick",
      "description": "offense_1 attacks defense_1 to commit the help, then kicks to offense_3 in the right corner for the shot.",
      "duration_ms": 2000,
      "actions": [
        {
          "player": "offense_1",
          "type": "dribble",
          "ball_id": "ball_1",
          "moves": [
            {
              "to": {
                "named": "left_elbow"
              },
              "around_player": "defense_1"
            }
          ]
        },
        {
          "player": "offense_3",
          "type": "cut",
          "variant": "fade",
          "moves": [
            {
              "to": {
                "named": "right_corner"
              }
            }
          ]
        },
        {
          "player": "offense_1",
          "type": "pass",
          "to_player": "offense_3",
          "ball_id": "ball_1",
          "variant": "overhead",
          "after": "offense_1.dribble"
        },
        {
          "player": "offense_3",
          "type": "shoot",
          "ball_id": "ball_1",
          "variant": "three",
          "on_catch": true
        }
      ],
      "end_state": {
        "offense_1": {
          "named": "left_elbow"
        },
        "offense_3": {
          "named": "right_corner"
        },
        "balls": {
          "ball_1": {
            "at": {
              "named": "basket"
            }
          }
        }
      },
      "branches": {
        "make": "frame_reset",
        "miss": "frame_oreb"
      }
    },
    {
      "id": "frame_oreb",
      "label": "Offensive Rebound",
      "description": "On a miss, offense_2 crashes from the left wing for the offensive rebound and finishes.",
      "duration_ms": 1500,
      "start_state": {
        "offense_2": {
          "named": "left_wing"
        },
        "balls": {
          "ball_1": {
            "at": {
              "named": "basket"
            }
          }
        }
      },
      "actions": [
        {
          "player": "offense_2",
          "type": "rebound",
          "ball_id": "ball_1",
          "variant": "offensive",
          "tags": [
            "put_back"
          ],
          "physicality": "aggressive"
        },
        {
          "player": "offense_2",
          "type": "shoot",
          "ball_id": "ball_1",
          "variant": "layup",
          "result": "make",
          "after": "offense_2.rebound"
        }
      ],
      "end_state": {
        "offense_2": {
          "named": "basket"
        },
        "balls": {
          "ball_1": {
            "dead": true
          }
        }
      }
    },
    {
      "id": "frame_reset",
      "label": "Reset",
      "description": "On a make, the ball is dead and the rep ends.",
      "actions": [],
      "end_state": {
        "balls": {
          "ball_1": {
            "dead": true
          }
        }
      }
    }
  ]
}