The Opennote Video API is not currently available. We are rolling out beta access to users on a per-request basis. If you are interested, email devtools@opennote.me with the subject line “Video API Access Request” and we’ll get back to you as soon as possible.

At Opennote, one of our core features is the ability to create interactive content. Students learn in a variety of ways, and we focus our platform to make it easy to create content that is engaging and interactive.

One of the ways we do this is through the use of video. On the Opennote platform, you can tag @Video in the chat to create a video. However, many users also want to create videos programmatically, and that’s where the Opennote Video API comes in.

Getting Started

To get started, you will need to create an account on Opennote. Once there, you can navigate to your Profile page and click the “API Keys” tab.

Within the API Keys page, you can manage your API keys, billing, and view logs from API calls. These are the API keys that you use in your Bearer tokens, as seen in the API Reference.

You will have to load credits before you make your first API request. You can do this by clicking the “Load Credits” button in the API Keys page.

Rate Limits

The Opennote Video API has three tiers of rate limits, outlined below:

TierRequests Per MinuteRequests Per Day
Developer350
Scale10150
EnterpriseCustomCustom

If you hit a rate limit, you will recieve a 429 status code. You can view the rate limit status of your API Organization in your API Keys page. Please note that rate limits are per API Organization, not per API key, so the rate limit applies to all API keys in the organization.

We only increase your usage tier on request. If you believe that your current usage exceeds your current tier, please contact us at devtools@opennote.me with the subject line “Video API Tier Increase”, and we’ll get back to you as soon as possible.

Video Metadata

We serialize certain data into the URL of a video so you can keep the data together wherever you are displaying the video. Take the below URL for example (which was for an example video, but all URLs for videos are formatted the same way):

This URL is divided into 5 parts:

  1. The AWS Bucket URL (You can ignore this one): “https://videofs-opennote-us-east-1.s3.us-east-1.amazonaws.com
  2. The Date/Time that the Video was Created: “2025-05-22T08%3A01%3A37.813968”
  3. A Unique Identifier (You can also ignore this one, it’s only for our purposes): “d56e1774-d254-47f6-a006-54efa8199f53”
  4. The Title of the Video in URL Encoded Format: “Video%2520Test%2520Example%2520Explained”
  5. The File Type (Always will be “.mp4”): “.mp4”

Below shows two examples of how you can parse this data out in Python and TypeScript.

Python

import urllib.parse
import re

# Example video URL with metadata embedded in the filename
url = "https://videofs-opennote-us-east-1.s3.us-east-1.amazonaws.com/2025-05-22T08%3A01%3A37.813968-d56e1774-d254-47f6-a006-54efa8199f53--Video%2520Test%2520Example%2520Explained.mp4"

# 1. Strip the AWS bucket prefix (can be ignored in most cases)
base_url = "https://videofs-opennote-us-east-1.s3.us-east-1.amazonaws.com/"
path = url[len(base_url):]

# 2. Decode any URL-encoded characters twice (handles %2520 → %20 → space)
decoded_path = urllib.parse.unquote(urllib.parse.unquote(path))

# 3. Use regex to extract the metadata parts
match = re.match(
    r"(?P<datetime>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+)-"
    r"(?P<uuid>[a-f0-9\-]+)--"
    r"(?P<title>.+)\.mp4",
    decoded_path
)

print("AWS Bucket URL    :", base_url)
print("Date/Time Created :", match.group("datetime"))
print("Unique Identifier :", match.group("uuid"))
print("Video Title       :", match.group("title"))
print("File Type         : .mp4")

TypeScript

// Example video URL with metadata embedded in the filename
const url = "https://videofs-opennote-us-east-1.s3.us-east-1.amazonaws.com/2025-05-22T08%3A01%3A37.813968-d56e1774-d254-47f6-a006-54efa8199f53--Video%2520Test%2520Example%2520Explained.mp4";

// 1. Strip the AWS bucket prefix
const baseUrl = "https://videofs-opennote-us-east-1.s3.us-east-1.amazonaws.com/";
const path = url.slice(baseUrl.length);

// 2. Decode any URL-encoded characters twice (handles %2520 → %20 → space)
const decodedPath = decodeURIComponent(decodeURIComponent(path));

// 3. Use regex to extract the metadata parts
const regex = /(?<datetime>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+)-(?<uuid>[a-f0-9\-]+)--(?<title>.+)\.mp4/;
const match = decodedPath.match(regex);

if (match && match.groups) {
    console.log("AWS Bucket URL    :", baseUrl);
    console.log("Date/Time Created :", match.groups["datetime"]);
    console.log("Unique Identifier :", match.groups["uuid"]);
    console.log("Video Title       :", match.groups["title"]);
    console.log("File Type         : .mp4");
} else {
    console.error("Could not parse video metadata from the URL.");
}

If you have any questions about the API, or need to contact a developer, you can do so via emailing devtools@opennote.me or joining our Discord!