curl --request POST \
--url https://api.meetingkit.com/api/v1/files \
--header 'Authorization: <api-key>' \
--header 'Content-Type: multipart/form-data' \
--form file=@example-file \
--form purpose=brand_kit \
--form workspace_id=wks_01k6a2r9s8x7c2dvq3m5n6p4abimport requests
url = "https://api.meetingkit.com/api/v1/files"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"purpose": "brand_kit",
"workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab"
}
headers = {"Authorization": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('purpose', 'brand_kit');
form.append('workspace_id', 'wks_01k6a2r9s8x7c2dvq3m5n6p4ab');
const options = {method: 'POST', headers: {Authorization: '<api-key>'}};
options.body = form;
fetch('https://api.meetingkit.com/api/v1/files', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meetingkit.com/api/v1/files",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nbrand_kit\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"workspace_id\"\r\n\r\nwks_01k6a2r9s8x7c2dvq3m5n6p4ab\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.meetingkit.com/api/v1/files"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nbrand_kit\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"workspace_id\"\r\n\r\nwks_01k6a2r9s8x7c2dvq3m5n6p4ab\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.meetingkit.com/api/v1/files")
.header("Authorization", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nbrand_kit\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"workspace_id\"\r\n\r\nwks_01k6a2r9s8x7c2dvq3m5n6p4ab\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetingkit.com/api/v1/files")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nbrand_kit\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"workspace_id\"\r\n\r\nwks_01k6a2r9s8x7c2dvq3m5n6p4ab\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"object": "file",
"purpose": "brand_kit",
"workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
"filename": "logo.png",
"content_type": "image/png",
"size": 48213,
"url": "https://assets.meetingkit.com/files/logo.png?Expires=1822298280&Signature=…",
"created_at": "2026-09-30T09:58:00Z"
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}Upload a file
Uploads an image to a workspace, as multipart/form-data, and returns a file with a
file_ id. The key must be an owner or admin of the workspace, and the workspace’s
plan must include notetaker customization. A workspace takes 60 uploads a minute.
The image is a PNG, JPEG, GIF, WebP or SVG of at most 10 MB. Its type is read from its bytes, not from its name or declared type.
An accepted file is not always one the notetaker can draw. It draws a PNG, GIF or WebP
under 16 megapixels, a JPEG under 16 megapixels (under 100 for an image tile), and an
SVG of at most 1 MB that is strict XML with no DOCTYPE and declares no side of 384,000 px
or more. It leaves out the images an SVG links to or embeds, and shows an animation’s
first frame. For any other file the kit keeps it, but a logo tile shows the default
logo, an image tile shows its background color, and the email shows the file as
uploaded.
curl --request POST \
--url https://api.meetingkit.com/api/v1/files \
--header 'Authorization: <api-key>' \
--header 'Content-Type: multipart/form-data' \
--form file=@example-file \
--form purpose=brand_kit \
--form workspace_id=wks_01k6a2r9s8x7c2dvq3m5n6p4abimport requests
url = "https://api.meetingkit.com/api/v1/files"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"purpose": "brand_kit",
"workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab"
}
headers = {"Authorization": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('purpose', 'brand_kit');
form.append('workspace_id', 'wks_01k6a2r9s8x7c2dvq3m5n6p4ab');
const options = {method: 'POST', headers: {Authorization: '<api-key>'}};
options.body = form;
fetch('https://api.meetingkit.com/api/v1/files', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meetingkit.com/api/v1/files",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nbrand_kit\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"workspace_id\"\r\n\r\nwks_01k6a2r9s8x7c2dvq3m5n6p4ab\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.meetingkit.com/api/v1/files"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nbrand_kit\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"workspace_id\"\r\n\r\nwks_01k6a2r9s8x7c2dvq3m5n6p4ab\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.meetingkit.com/api/v1/files")
.header("Authorization", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nbrand_kit\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"workspace_id\"\r\n\r\nwks_01k6a2r9s8x7c2dvq3m5n6p4ab\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetingkit.com/api/v1/files")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nbrand_kit\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"workspace_id\"\r\n\r\nwks_01k6a2r9s8x7c2dvq3m5n6p4ab\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"object": "file",
"purpose": "brand_kit",
"workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
"filename": "logo.png",
"content_type": "image/png",
"size": 48213,
"url": "https://assets.meetingkit.com/files/logo.png?Expires=1822298280&Signature=…",
"created_at": "2026-09-30T09:58:00Z"
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}Authorizations
Your API key, sent bare. See Authentication.
Body
The image, a PNG, JPEG, GIF, WebP or SVG of at most 10 MB.
What the file is for. brand_kit: an image for a brand kit.
brand_kit The workspace the file belongs to. Optional when the key belongs to exactly one workspace, which is then used. A wks_ id; integer workspace ids are still accepted.
"wks_01k6a2r9s8x7c2dvq3m5n6p4ab"
Response
File uploaded.
File ID, beginning with file_.
Always file.
What the file is for. brand_kit: an image for a brand kit.
brand_kit The workspace the file belongs to, a wks_ id.
The name the file was uploaded with. Its extension is replaced when it does not match the image type.
The image type, read from the file's bytes.
image/png: PNG.image/jpeg: JPEG.image/gif: GIF.image/webp: WebP.image/svg+xml: SVG.
image/png, image/jpeg, image/gif, image/webp, image/svg+xml Size in bytes.
A signed URL to download the file, valid for one year. Every read returns a fresh one. An SVG is served as a download, never inline.
When the file was uploaded, in ISO 8601.