Skip to main content
POST
/
automation
/
publish-clip
Publish Clip
curl --request POST \
  --url https://public.reap.video/api/v1/automation/publish-clip \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "projectId": "<string>",
  "clipId": "<string>",
  "integrations": [
    "<string>"
  ],
  "title": "<string>",
  "description": "<string>",
  "tags": [
    "<string>"
  ],
  "platformSettings": {
    "youtube": {
      "privacy": "public",
      "embeddable": true,
      "publicStats": true,
      "madeForKids": false
    },
    "tiktok": {
      "privacy": "public",
      "disableComments": false,
      "disableDuet": false,
      "disableStitch": false,
      "brandContent": false,
      "brandOrganic": false
    },
    "instagram": {
      "shareToFeed": false
    },
    "linkedin": {
      "privacy": "public"
    }
  }
}
'
import requests

url = "https://public.reap.video/api/v1/automation/publish-clip"

payload = {
"projectId": "<string>",
"clipId": "<string>",
"integrations": ["<string>"],
"title": "<string>",
"description": "<string>",
"tags": ["<string>"],
"platformSettings": {
"youtube": {
"privacy": "public",
"embeddable": True,
"publicStats": True,
"madeForKids": False
},
"tiktok": {
"privacy": "public",
"disableComments": False,
"disableDuet": False,
"disableStitch": False,
"brandContent": False,
"brandOrganic": False
},
"instagram": { "shareToFeed": False },
"linkedin": { "privacy": "public" }
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
projectId: '<string>',
clipId: '<string>',
integrations: ['<string>'],
title: '<string>',
description: '<string>',
tags: ['<string>'],
platformSettings: {
youtube: {privacy: 'public', embeddable: true, publicStats: true, madeForKids: false},
tiktok: {
privacy: 'public',
disableComments: false,
disableDuet: false,
disableStitch: false,
brandContent: false,
brandOrganic: false
},
instagram: {shareToFeed: false},
linkedin: {privacy: 'public'}
}
})
};

fetch('https://public.reap.video/api/v1/automation/publish-clip', 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://public.reap.video/api/v1/automation/publish-clip",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'projectId' => '<string>',
'clipId' => '<string>',
'integrations' => [
'<string>'
],
'title' => '<string>',
'description' => '<string>',
'tags' => [
'<string>'
],
'platformSettings' => [
'youtube' => [
'privacy' => 'public',
'embeddable' => true,
'publicStats' => true,
'madeForKids' => false
],
'tiktok' => [
'privacy' => 'public',
'disableComments' => false,
'disableDuet' => false,
'disableStitch' => false,
'brandContent' => false,
'brandOrganic' => false
],
'instagram' => [
'shareToFeed' => false
],
'linkedin' => [
'privacy' => 'public'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$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://public.reap.video/api/v1/automation/publish-clip"

payload := strings.NewReader("{\n \"projectId\": \"<string>\",\n \"clipId\": \"<string>\",\n \"integrations\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"platformSettings\": {\n \"youtube\": {\n \"privacy\": \"public\",\n \"embeddable\": true,\n \"publicStats\": true,\n \"madeForKids\": false\n },\n \"tiktok\": {\n \"privacy\": \"public\",\n \"disableComments\": false,\n \"disableDuet\": false,\n \"disableStitch\": false,\n \"brandContent\": false,\n \"brandOrganic\": false\n },\n \"instagram\": {\n \"shareToFeed\": false\n },\n \"linkedin\": {\n \"privacy\": \"public\"\n }\n }\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://public.reap.video/api/v1/automation/publish-clip")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"projectId\": \"<string>\",\n \"clipId\": \"<string>\",\n \"integrations\": [\n \"<string>\"\n ],\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"platformSettings\": {\n \"youtube\": {\n \"privacy\": \"public\",\n \"embeddable\": true,\n \"publicStats\": true,\n \"madeForKids\": false\n },\n \"tiktok\": {\n \"privacy\": \"public\",\n \"disableComments\": false,\n \"disableDuet\": false,\n \"disableStitch\": false,\n \"brandContent\": false,\n \"brandOrganic\": false\n },\n \"instagram\": {\n \"shareToFeed\": false\n },\n \"linkedin\": {\n \"privacy\": \"public\"\n }\n }\n}")
.asString();
{
  "id": "<string>",
  "projectId": "<string>",
  "clipId": "<string>",
  "platforms": [
    "<string>"
  ],
  "successPlatforms": [
    "<string>"
  ],
  "failedPlatforms": [
    "<string>"
  ],
  "integrations": [
    "<string>"
  ],
  "title": "<string>",
  "description": "<string>",
  "tags": [
    "<string>"
  ],
  "scheduleDate": 123,
  "publishDate": 123,
  "urls": {},
  "platformSettings": {
    "youtube": {
      "privacy": "public",
      "embeddable": true,
      "publicStats": true,
      "madeForKids": false
    },
    "tiktok": {
      "privacy": "public",
      "disableComments": false,
      "disableDuet": false,
      "disableStitch": false,
      "brandContent": false,
      "brandOrganic": false
    },
    "instagram": {
      "shareToFeed": false
    },
    "linkedin": {
      "privacy": "public"
    }
  },
  "createdAt": 123,
  "updatedAt": 123
}
For AI agents: a documentation index is at /llms.txt. Every page is also available as markdown, just append .md to the URL.

Overview

Publish a completed clip directly to one or more social media platforms. The clip must have a completed status before it can be published. Use Get Integrations to retrieve your available integration IDs.

Rate Limiting

This endpoint is rate limited to 10 requests per minute per API key.
Only completed clips can be published. Get integration IDs from the Get Integrations endpoint. The platformSettings object lets you configure per-platform settings. Only include platforms you’re publishing to.
Clips belonging to a cancelled project can’t be published. The API returns 400“This project was cancelled and can no longer be modified or published.”

Response

id
string
Unique post identifier
projectId
string
ID of the parent project
clipId
string
ID of the published clip
platforms
array
Array of target platform names
successPlatforms
array
Platforms where publishing succeeded
failedPlatforms
array
Platforms where publishing failed
integrations
array
Array of integration IDs used for publishing
title
string
Post title
description
string
Post description
tags
array
Array of tags applied to the post
status
string
Current post status
  • processing - Post is being published
  • completed - Published successfully to all platforms
  • failed - Publishing failed on all platforms
  • unresolved - Partial success (some platforms failed)
scheduleType
string
Type of scheduling (immediate or scheduled)
scheduleDate
integer
Scheduled publish date as Unix timestamp (null for immediate)
publishDate
integer
Actual publish date as Unix timestamp
urls
object
Published URLs per platform (populated after successful publishing)
platformSettings
object
Per-platform configuration
createdAt
integer
Unix timestamp when the post was created
updatedAt
integer
Unix timestamp when the post was last updated

Example Request

curl -X POST "https://public.reap.video/api/v1/automation/publish-clip" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "projectId": "65f1a2b3c4d5e6f7a8b9c0d2",
    "clipId": "65f1a2b3c4d5e6f7a8b9c0d4",
    "integrations": ["66a1b2c3d4e5f6a7b8c9d0e1"],
    "title": "The Future of AI",
    "description": "Exploring how AI will transform our daily lives",
    "tags": ["ai", "technology", "future"],
    "platformSettings": {
      "youtube": {
        "privacy": "private",
        "embeddable": true,
        "publicStats": true,
        "madeForKids": false
      }
    }
  }'
const response = await fetch('https://public.reap.video/api/v1/automation/publish-clip', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    projectId: '65f1a2b3c4d5e6f7a8b9c0d2',
    clipId: '65f1a2b3c4d5e6f7a8b9c0d4',
    integrations: ['66a1b2c3d4e5f6a7b8c9d0e1'],
    title: 'The Future of AI',
    description: 'Exploring how AI will transform our daily lives',
    tags: ['ai', 'technology', 'future'],
    platformSettings: {
      youtube: {
        privacy: 'private',
        embeddable: true,
        publicStats: true,
        madeForKids: false
      }
    }
  })
});

const post = await response.json();
console.log('Post created:', post.id, 'Status:', post.status);
import requests

headers = {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
}

data = {
    'projectId': '65f1a2b3c4d5e6f7a8b9c0d2',
    'clipId': '65f1a2b3c4d5e6f7a8b9c0d4',
    'integrations': ['66a1b2c3d4e5f6a7b8c9d0e1'],
    'title': 'The Future of AI',
    'description': 'Exploring how AI will transform our daily lives',
    'tags': ['ai', 'technology', 'future'],
    'platformSettings': {
        'youtube': {
            'privacy': 'private',
            'embeddable': True,
            'publicStats': True,
            'madeForKids': False
        }
    }
}

response = requests.post(
    'https://public.reap.video/api/v1/automation/publish-clip',
    headers=headers,
    json=data
)

post = response.json()
print(f"Post created: {post['id']} Status: {post['status']}")
<?php
$data = [
    'projectId' => '65f1a2b3c4d5e6f7a8b9c0d2',
    'clipId' => '65f1a2b3c4d5e6f7a8b9c0d4',
    'integrations' => ['66a1b2c3d4e5f6a7b8c9d0e1'],
    'title' => 'The Future of AI',
    'description' => 'Exploring how AI will transform our daily lives',
    'tags' => ['ai', 'technology', 'future'],
    'platformSettings' => [
        'youtube' => [
            'privacy' => 'private',
            'embeddable' => true,
            'publicStats' => true,
            'madeForKids' => false
        ]
    ]
];

$ch = curl_init('https://public.reap.video/api/v1/automation/publish-clip');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$post = json_decode($response, true);
echo 'Post created: ' . $post['id'] . ' Status: ' . $post['status'] . "\n";
?>
package main
import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)
func main() {
    data := map[string]interface{}{
        "projectId":    "65f1a2b3c4d5e6f7a8b9c0d2",
        "clipId":       "65f1a2b3c4d5e6f7a8b9c0d4",
        "integrations": []string{"66a1b2c3d4e5f6a7b8c9d0e1"},
        "title":        "The Future of AI",
        "description":  "Exploring how AI will transform our daily lives",
        "tags":         []string{"ai", "technology", "future"},
        "platformSettings": map[string]interface{}{
            "youtube": map[string]interface{}{
                "privacy":     "private",
                "embeddable":  true,
                "publicStats": true,
                "madeForKids": false,
            },
        },
    }
    jsonData, _ := json.Marshal(data)
    req, _ := http.NewRequest("POST", "https://public.reap.video/api/v1/automation/publish-clip", bytes.NewBuffer(jsonData))
    req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
    req.Header.Set("Content-Type", "application/json")
    client := &http.Client{}
    resp, _ := client.Do(req)
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
public class PublishClipExample {
    public static void main(String[] args) throws Exception {
        URL url = new URL("https://public.reap.video/api/v1/automation/publish-clip");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "Bearer YOUR_API_KEY");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);
        String jsonBody = """
            {
              "projectId": "65f1a2b3c4d5e6f7a8b9c0d2",
              "clipId": "65f1a2b3c4d5e6f7a8b9c0d4",
              "integrations": ["66a1b2c3d4e5f6a7b8c9d0e1"],
              "title": "The Future of AI",
              "description": "Exploring how AI will transform our daily lives",
              "tags": ["ai", "technology", "future"],
              "platformSettings": {
                "youtube": {
                  "privacy": "private",
                  "embeddable": true,
                  "publicStats": true,
                  "madeForKids": false
                }
              }
            }""";
        try (OutputStream os = conn.getOutputStream()) {
            os.write(jsonBody.getBytes("utf-8"));
        }
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
        StringBuilder response = new StringBuilder();
        String responseLine;
        while ((responseLine = br.readLine()) != null) {
            response.append(responseLine.trim());
        }
        System.out.println(response.toString());
    }
}

Example Response

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Body

application/json
projectId
string
required

ID of the project containing the clip

clipId
string
required

ID of the clip to publish

integrations
string[]
required

List of integration IDs to publish to

title
string | null

Post title (defaults to clip title)

description
string | null

Post description

tags
string[] | null

Post tags (max 10)

platformSettings
object | null

Per-platform publishing settings

Response

200 - application/json

Successful response

id
string
projectId
string | null
clipId
string | null
platforms
string[]
successPlatforms
string[]
failedPlatforms
string[]
integrations
string[]
title
string | null
description
string | null
tags
string[] | null
status
enum<string>
Available options:
processing,
draft,
completed,
failed,
cancelled,
unresolved
scheduleType
enum<string>
Available options:
scheduled,
immediate
scheduleDate
integer
publishDate
integer
urls
object

Social media URLs keyed by integration ID

platformSettings
object
createdAt
integer
updatedAt
integer