PrismClip

Generated reference

PrismClip API

Every operation below is generated from the same Zod contract used by REST validation and MCP tool registration.

Projects

List owned projects

GET/api/v1/projects

List active projects owned by the API-key account in reverse creation order. Use the returned opaque cursor to read the next page.

Operation ID
listProjects
Scopes
projects:read
MCP tool
list_projects

Parameters

NameLocationRequiredDescription
limitqueryNoMaximum projects to return, from 1 to 100
cursorqueryNoOpaque cursor returned by the previous page

Responses and errors

200Owned projects and a cursor when another page is available.
{
  "type": "object",
  "properties": {
    "projects": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "filename": {
            "type": "string"
          },
          "mimeType": {
            "type": "string"
          },
          "byteLength": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "durationMs": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "width": {
            "anyOf": [
              {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "height": {
            "anyOf": [
              {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string"
          },
          "claim": {
            "type": "string"
          },
          "targetSeconds": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "activeMomentSetId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "activeRenderVariantId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "description": "ISO 8601 timestamp"
          },
          "updatedAt": {
            "type": "string",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "filename",
          "mimeType",
          "byteLength",
          "durationMs",
          "width",
          "height",
          "status",
          "claim",
          "targetSeconds",
          "activeMomentSetId",
          "activeRenderVariantId",
          "error",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      }
    },
    "nextCursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "projects",
    "nextCursor"
  ],
  "additionalProperties": false
}
400The limit or cursor is invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks projects:read.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Project storage is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl "https://prismclip.com/api/v1/projects?limit=20" \
  -H "Authorization: Bearer $PRISMCLIP_API_KEY"
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/projects?limit=20",
  { headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}` } }
);
const { projects, nextCursor } = await response.json();
Python
import os, requests

response = requests.get(
    "https://prismclip.com/api/v1/projects",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
    params={"limit": 20},
)
projects = response.json()["projects"]

Sources

Create a direct-upload project

POST/api/v1/projects

Create an owned project for a local media file and return bounded multipart upload instructions. Upload every part with the returned upload ID, retain each ETag, then complete the session.

Operation ID
createDirectUpload
Scopes
projects:write
MCP tool
create_direct_upload

Request body

{
  "contentType": "application/json",
  "schema": {
    "type": "object",
    "properties": {
      "filename": {
        "type": "string",
        "minLength": 1,
        "maxLength": 180,
        "description": "Original local media filename"
      },
      "mime_type": {
        "type": "string",
        "minLength": 1,
        "maxLength": 120,
        "description": "Video, audio, or application/octet-stream MIME type"
      },
      "byte_length": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 10737418240,
        "description": "Exact source size in bytes"
      },
      "duration_ms": {
        "description": "Known source duration in milliseconds",
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      },
      "width": {
        "description": "Known source width in pixels",
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      },
      "height": {
        "description": "Known source height in pixels",
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    },
    "required": [
      "filename",
      "mime_type",
      "byte_length"
    ],
    "additionalProperties": false
  }
}

Responses and errors

201The uploading project and its bounded multipart instructions.
{
  "type": "object",
  "properties": {
    "project": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "filename": {
          "type": "string"
        },
        "mimeType": {
          "type": "string"
        },
        "byteLength": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "durationMs": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "status": {
          "type": "string"
        },
        "claim": {
          "type": "string"
        },
        "targetSeconds": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "activeMomentSetId": {
          "anyOf": [
            {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            {
              "type": "null"
            }
          ]
        },
        "activeRenderVariantId": {
          "anyOf": [
            {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            {
              "type": "null"
            }
          ]
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "id",
        "filename",
        "mimeType",
        "byteLength",
        "durationMs",
        "width",
        "height",
        "status",
        "claim",
        "targetSeconds",
        "activeMomentSetId",
        "activeRenderVariantId",
        "error",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    },
    "upload": {
      "type": "object",
      "properties": {
        "uploadId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 512,
          "description": "Opaque multipart upload session ID returned when the project was created"
        },
        "partBytes": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "partCount": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 10000
        },
        "partUrlTemplate": {
          "type": "string"
        },
        "completeUrl": {
          "type": "string"
        },
        "cancelUrl": {
          "type": "string"
        }
      },
      "required": [
        "uploadId",
        "partBytes",
        "partCount",
        "partUrlTemplate",
        "completeUrl",
        "cancelUrl"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "project",
    "upload"
  ],
  "additionalProperties": false
}
400The filename, MIME type, dimensions, duration, or byte length is invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks projects:write.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
413The source exceeds the direct-upload size limit.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Project or object storage is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/projects \
  -X POST -H "Authorization: Bearer $PRISMCLIP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filename":"recording.mp4","mime_type":"video/mp4","byte_length":52428800}'
TypeScript
const response = await fetch("https://prismclip.com/api/v1/projects", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ filename: "recording.mp4", mime_type: "video/mp4", byte_length: 52428800 })
});
const { project, upload } = await response.json();
Python
import os, requests

response = requests.post(
    "https://prismclip.com/api/v1/projects",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
    json={"filename": "recording.mp4", "mime_type": "video/mp4", "byte_length": 52428800},
)
project, upload = response.json()["project"], response.json()["upload"]

Projects

Get an owned project

GET/api/v1/projects/{projectId}

Retrieve processing state and media metadata for one active project owned by the API-key account.

Operation ID
getProject
Scopes
projects:read
MCP tool
get_project

Parameters

NameLocationRequiredDescription
projectIdpathYesOwned PrismClip project ID

Responses and errors

200The owned project.
{
  "type": "object",
  "properties": {
    "project": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "filename": {
          "type": "string"
        },
        "mimeType": {
          "type": "string"
        },
        "byteLength": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "durationMs": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "status": {
          "type": "string"
        },
        "claim": {
          "type": "string"
        },
        "targetSeconds": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "activeMomentSetId": {
          "anyOf": [
            {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            {
              "type": "null"
            }
          ]
        },
        "activeRenderVariantId": {
          "anyOf": [
            {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            {
              "type": "null"
            }
          ]
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "id",
        "filename",
        "mimeType",
        "byteLength",
        "durationMs",
        "width",
        "height",
        "status",
        "claim",
        "targetSeconds",
        "activeMomentSetId",
        "activeRenderVariantId",
        "error",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "project"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks projects:read.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
404The owned project was not found.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Project storage is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111 \
  -H "Authorization: Bearer $PRISMCLIP_API_KEY"
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111",
  { headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}` } }
);
const { project } = await response.json();
Python
import os, requests

response = requests.get(
    "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
)
project = response.json()["project"]

Sources

Upload a direct-upload part

PUT/api/v1/projects/{projectId}/upload/parts/{partNumber}

Stream exactly the expected bytes for one multipart part. Send the opaque upload session ID in X-PrismClip-Upload-Id and retain the returned ETag. Binary transfer is available through REST and is intentionally omitted from MCP tools.

Operation ID
uploadDirectPart
Scopes
projects:write

Parameters

NameLocationRequiredDescription
projectIdpathYesOwned uploading project ID
partNumberpathYesSequential multipart part number
X-PrismClip-Upload-IdheaderYesOpaque upload session ID returned when the project was created

Request body

{
  "contentType": "application/octet-stream",
  "schema": {
    "type": "string",
    "format": "binary"
  }
}

Responses and errors

200The uploaded part number and ETag required for completion.
{
  "type": "object",
  "properties": {
    "partNumber": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "etag": {
      "type": "string"
    }
  },
  "required": [
    "partNumber",
    "etag"
  ],
  "additionalProperties": false
}
400The part number or byte count is invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks projects:write.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
404The owned project was not found.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
409The upload session or project state does not match.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Project or object storage is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/upload/parts/1 \
  -X PUT -H "Authorization: Bearer $PRISMCLIP_API_KEY" \
  -H "X-PrismClip-Upload-Id: opaque-upload-session-id" \
  -H "Content-Type: application/octet-stream" --data-binary @part-001
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/upload/parts/1",
  { method: "PUT", headers: {
      Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}`,
      "X-PrismClip-Upload-Id": upload.uploadId,
      "Content-Type": "application/octet-stream"
    }, body: partBytes }
);
const { etag } = await response.json();
Python
import os, requests

with open("part-001", "rb") as part:
    response = requests.put(
        "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/upload/parts/1",
        headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}",
                 "X-PrismClip-Upload-Id": "opaque-upload-session-id"},
        data=part,
    )
etag = response.json()["etag"]

Sources

Complete a direct upload

POST/api/v1/projects/{projectId}/upload/complete

Complete an owned multipart upload after every part succeeds. Provide the returned ETags in sequential order and send the upload session ID in X-PrismClip-Upload-Id.

Operation ID
completeDirectUpload
Scopes
projects:write
MCP tool
complete_direct_upload

Parameters

NameLocationRequiredDescription
projectIdpathYesOwned uploading project ID
X-PrismClip-Upload-IdheaderYesOpaque upload session ID returned when the project was created

Request body

{
  "contentType": "application/json",
  "schema": {
    "type": "object",
    "properties": {
      "parts": {
        "minItems": 1,
        "maxItems": 10000,
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "part_number": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "description": "Sequential multipart part number"
            },
            "etag": {
              "type": "string",
              "minLength": 1,
              "maxLength": 512,
              "description": "ETag returned after uploading the part"
            }
          },
          "required": [
            "part_number",
            "etag"
          ],
          "additionalProperties": false
        },
        "description": "Every uploaded part in sequential order"
      }
    },
    "required": [
      "parts"
    ],
    "additionalProperties": false
  }
}

Responses and errors

200The completed project, ready for source processing.
{
  "type": "object",
  "properties": {
    "project": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "filename": {
          "type": "string"
        },
        "mimeType": {
          "type": "string"
        },
        "byteLength": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "durationMs": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "status": {
          "type": "string"
        },
        "claim": {
          "type": "string"
        },
        "targetSeconds": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "activeMomentSetId": {
          "anyOf": [
            {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            {
              "type": "null"
            }
          ]
        },
        "activeRenderVariantId": {
          "anyOf": [
            {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            {
              "type": "null"
            }
          ]
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "id",
        "filename",
        "mimeType",
        "byteLength",
        "durationMs",
        "width",
        "height",
        "status",
        "claim",
        "targetSeconds",
        "activeMomentSetId",
        "activeRenderVariantId",
        "error",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "project"
  ],
  "additionalProperties": false
}
400The part list is incomplete or the stored byte count does not match.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks projects:write.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
404The owned project was not found.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
409The upload session or project state does not match.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Project or object storage is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/upload/complete \
  -X POST -H "Authorization: Bearer $PRISMCLIP_API_KEY" \
  -H "X-PrismClip-Upload-Id: opaque-upload-session-id" \
  -H "Content-Type: application/json" \
  -d '{"parts":[{"part_number":1,"etag":"synthetic-part-etag"}]}'
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/upload/complete",
  { method: "POST", headers: {
      Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}`,
      "X-PrismClip-Upload-Id": upload.uploadId,
      "Content-Type": "application/json"
    }, body: JSON.stringify({ parts: [{ part_number: 1, etag }] }) }
);
const { project } = await response.json();
Python
import os, requests

response = requests.post(
    "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/upload/complete",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}",
             "X-PrismClip-Upload-Id": "opaque-upload-session-id"},
    json={"parts": [{"part_number": 1, "etag": "synthetic-part-etag"}]},
)
project = response.json()["project"]

Sources

Cancel a direct upload

DELETE/api/v1/projects/{projectId}/upload

Abort an active multipart upload owned by the API-key account and mark its project cancelled. Send the upload session ID in X-PrismClip-Upload-Id.

Operation ID
cancelDirectUpload
Scopes
projects:write
MCP tool
cancel_direct_upload

Parameters

NameLocationRequiredDescription
projectIdpathYesOwned uploading project ID
X-PrismClip-Upload-IdheaderYesOpaque upload session ID returned when the project was created

Responses and errors

200The cancelled project.
{
  "type": "object",
  "properties": {
    "project": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "filename": {
          "type": "string"
        },
        "mimeType": {
          "type": "string"
        },
        "byteLength": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "durationMs": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "status": {
          "type": "string"
        },
        "claim": {
          "type": "string"
        },
        "targetSeconds": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "activeMomentSetId": {
          "anyOf": [
            {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            {
              "type": "null"
            }
          ]
        },
        "activeRenderVariantId": {
          "anyOf": [
            {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            {
              "type": "null"
            }
          ]
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "id",
        "filename",
        "mimeType",
        "byteLength",
        "durationMs",
        "width",
        "height",
        "status",
        "claim",
        "targetSeconds",
        "activeMomentSetId",
        "activeRenderVariantId",
        "error",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    },
    "cancelled": {
      "type": "boolean",
      "const": true
    }
  },
  "required": [
    "project",
    "cancelled"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks projects:write.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
404The owned project was not found.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
409The upload session or project state does not match.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Project or object storage is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/upload \
  -X DELETE -H "Authorization: Bearer $PRISMCLIP_API_KEY" \
  -H "X-PrismClip-Upload-Id: opaque-upload-session-id"
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/upload",
  { method: "DELETE", headers: {
      Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}`,
      "X-PrismClip-Upload-Id": upload.uploadId
    } }
);
const { project, cancelled } = await response.json();
Python
import os, requests

response = requests.delete(
    "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/upload",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}",
             "X-PrismClip-Upload-Id": "opaque-upload-session-id"},
)
project = response.json()["project"]

Sources

Start a YouTube import

POST/api/v1/imports/youtube

Start a best-effort import of one YouTube video into an owned PrismClip project. Availability, download permission, restrictions, and provider behavior can prevent ingestion. Retain the original source until the import completes.

Operation ID
startYouTubeImport
Scopes
projects:write
MCP tool
start_youtube_import
Idempotency
supported

Request body

{
  "contentType": "application/json",
  "schema": {
    "type": "object",
    "properties": {
      "url": {
        "type": "string",
        "maxLength": 2000,
        "format": "uri",
        "description": "URL for one YouTube video; playlists are not supported"
      }
    },
    "required": [
      "url"
    ],
    "additionalProperties": false
  }
}

Responses and errors

200The existing import for this account and YouTube video.
{
  "type": "object",
  "properties": {
    "import": {
      "type": "object",
      "properties": {
        "jobId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "projectId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "provider": {
          "type": "string",
          "enum": [
            "google_drive",
            "youtube"
          ]
        },
        "status": {
          "type": "string"
        },
        "attemptCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "maxAttempts": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "errorCategory": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "cancelRequestedAt": {
          "anyOf": [
            {
              "type": "string",
              "description": "ISO 8601 timestamp"
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedBytes": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "byteCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "jobId",
        "projectId",
        "provider",
        "status",
        "attemptCount",
        "maxAttempts",
        "errorCategory",
        "cancelRequestedAt",
        "expectedBytes",
        "byteCount",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    },
    "replayed": {
      "type": "boolean"
    }
  },
  "required": [
    "import",
    "replayed"
  ],
  "additionalProperties": false
}
202The remote import was queued.
{
  "type": "object",
  "properties": {
    "import": {
      "type": "object",
      "properties": {
        "jobId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "projectId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "provider": {
          "type": "string",
          "enum": [
            "google_drive",
            "youtube"
          ]
        },
        "status": {
          "type": "string"
        },
        "attemptCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "maxAttempts": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "errorCategory": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "cancelRequestedAt": {
          "anyOf": [
            {
              "type": "string",
              "description": "ISO 8601 timestamp"
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedBytes": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "byteCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "jobId",
        "projectId",
        "provider",
        "status",
        "attemptCount",
        "maxAttempts",
        "errorCategory",
        "cancelRequestedAt",
        "expectedBytes",
        "byteCount",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    },
    "replayed": {
      "type": "boolean"
    }
  },
  "required": [
    "import",
    "replayed"
  ],
  "additionalProperties": false
}
400The URL is invalid or does not identify one supported YouTube video.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks projects:write.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
413Provider metadata shows that the source exceeds the remote-source limit.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
422YouTube rejected, restricted, or could not resolve the source.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Remote import storage, queueing, or the YouTube ingestion provider is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/imports/youtube   -X POST -H "Authorization: Bearer $PRISMCLIP_API_KEY"   -H "Content-Type: application/json"   -d '{"url":"https://www.youtube.com/watch?v=M7lc1UVf-VE"}'
TypeScript
const response = await fetch("https://prismclip.com/api/v1/imports/youtube", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ url: "https://www.youtube.com/watch?v=M7lc1UVf-VE" })
});
const { import: importJob, replayed } = await response.json();
Python
import os, requests

response = requests.post(
    "https://prismclip.com/api/v1/imports/youtube",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
    json={"url": "https://www.youtube.com/watch?v=M7lc1UVf-VE"},
)
import_job = response.json()["import"]

Sources

Start a Google Drive import

POST/api/v1/imports/google-drive

Start an import of one explicit Google Drive video or audio file. Public files are attempted directly. Private files use the Google Drive connection established by the account through PrismClip's normal OAuth flow; provider tokens never enter this API payload.

Operation ID
startGoogleDriveImport
Scopes
projects:write
MCP tool
start_google_drive_import
Idempotency
supported

Request body

{
  "contentType": "application/json",
  "schema": {
    "type": "object",
    "properties": {
      "url": {
        "type": "string",
        "maxLength": 2000,
        "format": "uri",
        "description": "URL for one explicit Google Drive video or audio file"
      }
    },
    "required": [
      "url"
    ],
    "additionalProperties": false
  }
}

Responses and errors

200The existing import for this account and Google Drive file.
{
  "type": "object",
  "properties": {
    "import": {
      "type": "object",
      "properties": {
        "jobId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "projectId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "provider": {
          "type": "string",
          "enum": [
            "google_drive",
            "youtube"
          ]
        },
        "status": {
          "type": "string"
        },
        "attemptCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "maxAttempts": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "errorCategory": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "cancelRequestedAt": {
          "anyOf": [
            {
              "type": "string",
              "description": "ISO 8601 timestamp"
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedBytes": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "byteCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "jobId",
        "projectId",
        "provider",
        "status",
        "attemptCount",
        "maxAttempts",
        "errorCategory",
        "cancelRequestedAt",
        "expectedBytes",
        "byteCount",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    },
    "replayed": {
      "type": "boolean"
    }
  },
  "required": [
    "import",
    "replayed"
  ],
  "additionalProperties": false
}
202The remote import was queued.
{
  "type": "object",
  "properties": {
    "import": {
      "type": "object",
      "properties": {
        "jobId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "projectId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "provider": {
          "type": "string",
          "enum": [
            "google_drive",
            "youtube"
          ]
        },
        "status": {
          "type": "string"
        },
        "attemptCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "maxAttempts": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "errorCategory": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "cancelRequestedAt": {
          "anyOf": [
            {
              "type": "string",
              "description": "ISO 8601 timestamp"
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedBytes": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "byteCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "jobId",
        "projectId",
        "provider",
        "status",
        "attemptCount",
        "maxAttempts",
        "errorCategory",
        "cancelRequestedAt",
        "expectedBytes",
        "byteCount",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    },
    "replayed": {
      "type": "boolean"
    }
  },
  "required": [
    "import",
    "replayed"
  ],
  "additionalProperties": false
}
400The URL is invalid or does not identify one explicit Google Drive file.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid, or the private file requires an account Google Drive connection.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks projects:write.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
413Provider metadata shows that the source exceeds the remote-source limit.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
422The file is unavailable, is not media, or cannot be downloaded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Remote import storage, queueing, or Google Drive is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/imports/google-drive   -X POST -H "Authorization: Bearer $PRISMCLIP_API_KEY"   -H "Content-Type: application/json"   -d '{"url":"https://drive.google.com/file/d/synthetic-file-id/view"}'
TypeScript
const response = await fetch("https://prismclip.com/api/v1/imports/google-drive", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ url: "https://drive.google.com/file/d/synthetic-file-id/view" })
});
const { import: importJob, replayed } = await response.json();
Python
import os, requests

response = requests.post(
    "https://prismclip.com/api/v1/imports/google-drive",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
    json={"url": "https://drive.google.com/file/d/synthetic-file-id/view"},
)
import_job = response.json()["import"]

Jobs

Get a remote import

GET/api/v1/imports/{jobId}

Read durable state, byte progress, retry attempts, and normalized failure category for an owned Google Drive or YouTube import.

Operation ID
getRemoteImport
Scopes
projects:read
MCP tool
get_remote_import

Parameters

NameLocationRequiredDescription
jobIdpathYesOwned remote import job ID

Responses and errors

200The current owned remote import state.
{
  "type": "object",
  "properties": {
    "import": {
      "type": "object",
      "properties": {
        "jobId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "projectId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "provider": {
          "type": "string",
          "enum": [
            "google_drive",
            "youtube"
          ]
        },
        "status": {
          "type": "string"
        },
        "attemptCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "maxAttempts": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "errorCategory": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "cancelRequestedAt": {
          "anyOf": [
            {
              "type": "string",
              "description": "ISO 8601 timestamp"
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedBytes": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "byteCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "jobId",
        "projectId",
        "provider",
        "status",
        "attemptCount",
        "maxAttempts",
        "errorCategory",
        "cancelRequestedAt",
        "expectedBytes",
        "byteCount",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "import"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks projects:read.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
404The owned remote import was not found.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Import state is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/imports/22222222-2222-4222-8222-222222222222 \
  -H "Authorization: Bearer $PRISMCLIP_API_KEY"
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/imports/22222222-2222-4222-8222-222222222222",
  { method: "GET", headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}` } }
);
const { import: importJob } = await response.json();
Python
import os, requests

response = requests.get(
    "https://prismclip.com/api/v1/imports/22222222-2222-4222-8222-222222222222",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
)
import_job = response.json()["import"]

Jobs

Cancel a remote import

DELETE/api/v1/imports/{jobId}

Request cancellation of an owned queued, retrying, or running Google Drive or YouTube import. Running work observes the durable cancellation request between bounded transfer parts.

Operation ID
cancelRemoteImport
Scopes
projects:write
MCP tool
cancel_remote_import

Parameters

NameLocationRequiredDescription
jobIdpathYesOwned remote import job ID

Responses and errors

200Cancellation was accepted and the updated import state is returned.
{
  "type": "object",
  "properties": {
    "import": {
      "type": "object",
      "properties": {
        "jobId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "projectId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "provider": {
          "type": "string",
          "enum": [
            "google_drive",
            "youtube"
          ]
        },
        "status": {
          "type": "string"
        },
        "attemptCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "maxAttempts": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "errorCategory": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "cancelRequestedAt": {
          "anyOf": [
            {
              "type": "string",
              "description": "ISO 8601 timestamp"
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedBytes": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "byteCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "jobId",
        "projectId",
        "provider",
        "status",
        "attemptCount",
        "maxAttempts",
        "errorCategory",
        "cancelRequestedAt",
        "expectedBytes",
        "byteCount",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    },
    "cancelled": {
      "type": "boolean",
      "const": true
    }
  },
  "required": [
    "import",
    "cancelled"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks projects:write.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
404The owned remote import was not found.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
409The import has finished or already has a cancellation request.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Import state is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/imports/22222222-2222-4222-8222-222222222222 \
  -X DELETE \
  -H "Authorization: Bearer $PRISMCLIP_API_KEY"
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/imports/22222222-2222-4222-8222-222222222222",
  { method: "DELETE", headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}` } }
);
const { import: importJob } = await response.json();
Python
import os, requests

response = requests.delete(
    "https://prismclip.com/api/v1/imports/22222222-2222-4222-8222-222222222222",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
)
import_job = response.json()["import"]

Evidence

Search the owned library

GET/api/v1/library

Search active owned projects across filenames, generated summaries, transcript words, and completed visual scene descriptions. Results identify which evidence sources matched and use a stable cursor.

Operation ID
searchLibrary
Scopes
evidence:read
MCP tool
search_library

Parameters

NameLocationRequiredDescription
qqueryNoWords to match across filename, summary, transcript, and visual scenes
limitqueryNoMaximum matching projects to return, from 1 to 50
cursorqueryNoOpaque cursor returned by the previous page

Responses and errors

200Owned matching projects with evidence match types and an optional next cursor.
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "project": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "filename": {
                "type": "string"
              },
              "mimeType": {
                "type": "string"
              },
              "byteLength": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "durationMs": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "width": {
                "anyOf": [
                  {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "height": {
                "anyOf": [
                  {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "status": {
                "type": "string"
              },
              "claim": {
                "type": "string"
              },
              "targetSeconds": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "activeMomentSetId": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "activeRenderVariantId": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "error": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "createdAt": {
                "type": "string",
                "description": "ISO 8601 timestamp"
              },
              "updatedAt": {
                "type": "string",
                "description": "ISO 8601 timestamp"
              }
            },
            "required": [
              "id",
              "filename",
              "mimeType",
              "byteLength",
              "durationMs",
              "width",
              "height",
              "status",
              "claim",
              "targetSeconds",
              "activeMomentSetId",
              "activeRenderVariantId",
              "error",
              "createdAt",
              "updatedAt"
            ],
            "additionalProperties": false
          },
          "summary": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "matches": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "title",
                "summary",
                "transcript",
                "visual"
              ]
            }
          }
        },
        "required": [
          "project",
          "summary",
          "matches"
        ],
        "additionalProperties": false
      }
    },
    "nextCursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "items",
    "nextCursor"
  ],
  "additionalProperties": false
}
400The query, limit, or cursor is invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks evidence:read.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Evidence storage is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl "https://prismclip.com/api/v1/library?q=stage+reaction&limit=20" \
  -H "Authorization: Bearer $PRISMCLIP_API_KEY"
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/library?q=stage+reaction&limit=20",
  { headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}` } }
);
const { items, nextCursor } = await response.json();
Python
import os, requests

response = requests.get(
    "https://prismclip.com/api/v1/library",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
    params={"q": "stage reaction", "limit": 20},
)
items = response.json()["items"]

Evidence

Get transcript words

GET/api/v1/projects/{projectId}/transcript

Retrieve a bounded passage of source-relative transcript words and exact timing from an owned project. Paginate with nextAfterOrdinal or constrain the result to a source time window.

Operation ID
getTranscriptPassage
Scopes
evidence:read
MCP tool
get_transcript_passage

Parameters

NameLocationRequiredDescription
projectIdpathYesOwned project ID
after_ordinalqueryNoReturn words after this ordinal; use -1 for the beginning
limitqueryNoMaximum timed words to return, from 1 to 500
start_msqueryNoOnly include words overlapping this source-relative start time
end_msqueryNoOnly include words overlapping this source-relative end time

Responses and errors

200A bounded transcript passage with exact word timing.
{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "text": {
      "type": "string"
    },
    "words": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "ordinal": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "text": {
            "type": "string"
          },
          "startMs": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "endMs": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "ordinal",
          "text",
          "startMs",
          "endMs"
        ],
        "additionalProperties": false
      }
    },
    "nextAfterOrdinal": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "projectId",
    "text",
    "words",
    "nextAfterOrdinal"
  ],
  "additionalProperties": false
}
400The pagination or source time window is invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks evidence:read.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
404The owned project or transcript was not found.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Evidence storage is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/transcript?start_ms=12000&end_ms=30000&limit=200" \
  -H "Authorization: Bearer $PRISMCLIP_API_KEY"
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/transcript?start_ms=12000&end_ms=30000&limit=200",
  { headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}` } }
);
const { text, words, nextAfterOrdinal } = await response.json();
Python
import os, requests

response = requests.get(
    "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/transcript",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
    params={"start_ms": 12000, "end_ms": 30000, "limit": 200},
)
words = response.json()["words"]

Evidence

Get visual scenes

GET/api/v1/projects/{projectId}/visual-scenes

Retrieve a bounded page of source-relative scenes from the latest completed full visual analysis for an owned project, including the analysis ID, model, duration, and timestamps needed for provenance.

Operation ID
getVisualScenes
Scopes
evidence:read
MCP tool
get_visual_scenes

Parameters

NameLocationRequiredDescription
projectIdpathYesOwned project ID
offsetqueryNoZero-based scene offset
limitqueryNoMaximum visual scenes to return, from 1 to 200

Responses and errors

200Completed visual analysis provenance and a bounded page of scenes.
{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "analysis": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "model": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "const": "completed"
        },
        "durationMs": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        }
      },
      "required": [
        "id",
        "model",
        "status",
        "durationMs",
        "createdAt",
        "updatedAt"
      ],
      "additionalProperties": false
    },
    "scenes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "index": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "startMs": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "endMs": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "description": {
            "type": "string"
          }
        },
        "required": [
          "index",
          "startMs",
          "endMs",
          "description"
        ],
        "additionalProperties": false
      }
    },
    "nextOffset": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "projectId",
    "analysis",
    "scenes",
    "nextOffset"
  ],
  "additionalProperties": false
}
400The scene offset or limit is invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
403The API key lacks evidence:read.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
404The owned project or completed visual analysis was not found.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Evidence storage is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/visual-scenes?offset=0&limit=100" \
  -H "Authorization: Bearer $PRISMCLIP_API_KEY"
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/visual-scenes?offset=0&limit=100",
  { headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}` } }
);
const { analysis, scenes, nextOffset } = await response.json();
Python
import os, requests

response = requests.get(
    "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/visual-scenes",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
    params={"offset": 0, "limit": 100},
)
scenes = response.json()["scenes"]

Moments

Queue automatic clip suggestions

POST/api/v1/projects/{projectId}/auto-pick

Queue 1–12 independent 15–30 second clip suggestions from an owned project's completed visual timeline. The operation is asynchronous and safely replayed with the same Idempotency-Key.

Operation ID
autoPickClips
Scopes
moments:write
MCP tool
auto_pick_clips
Idempotency
required

Parameters

NameLocationRequiredDescription
projectIdpathYesOwned PrismClip project ID
Idempotency-KeyheaderYesStable retry key containing 8 to 120 safe characters

Request body

{
  "contentType": "application/json",
  "schema": {
    "type": "object",
    "properties": {
      "count": {
        "default": 8,
        "description": "Number of independent clip suggestions to create",
        "type": "integer",
        "minimum": 1,
        "maximum": 12
      }
    },
    "required": [
      "count"
    ],
    "additionalProperties": false
  }
}

Responses and errors

200An earlier request with this idempotency key was replayed.
{
  "type": "object",
  "properties": {
    "job": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "status": {
          "type": "string"
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "requestedCount": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "projectId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "replayed": {
          "type": "boolean"
        }
      },
      "required": [
        "id",
        "status",
        "createdAt",
        "requestedCount",
        "projectId",
        "replayed"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "job"
  ],
  "additionalProperties": false
}
202The automatic selection job was queued.
{
  "type": "object",
  "properties": {
    "job": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "status": {
          "type": "string"
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "requestedCount": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "projectId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "replayed": {
          "type": "boolean"
        }
      },
      "required": [
        "id",
        "status",
        "createdAt",
        "requestedCount",
        "projectId",
        "replayed"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "job"
  ],
  "additionalProperties": false
}
400The count or idempotency key is invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
404The owned project was not found.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
409The project does not have a completed visual analysis.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
429The API-key rate limit was exceeded.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Automatic clip selection is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/auto-pick \
  -X POST -H "Authorization: Bearer $PRISMCLIP_API_KEY" \
  -H "Idempotency-Key: clip-request-001" \
  -H "Content-Type: application/json" -d '{"count":6}'
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/auto-pick",
  { method: "POST", headers: {
      Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}`,
      "Idempotency-Key": "clip-request-001",
      "Content-Type": "application/json"
    }, body: JSON.stringify({ count: 6 }) }
);
const { job } = await response.json();
Python
import os, requests

response = requests.post(
    "https://prismclip.com/api/v1/projects/11111111-1111-4111-8111-111111111111/auto-pick",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}",
             "Idempotency-Key": "clip-request-001"},
    json={"count": 6},
)
job = response.json()["job"]

Jobs

Get an automatic clip-selection job

GET/api/v1/jobs/{jobId}

Read an owned automatic clip-selection job. Completed jobs include their candidate moments.

Operation ID
getAutoPickJob
Scopes
projects:read
MCP tool
get_auto_pick_job

Parameters

NameLocationRequiredDescription
jobIdpathYesPrismClip job ID

Responses and errors

200The current job and completed candidates when available.
{
  "type": "object",
  "properties": {
    "job": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "projectId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "status": {
          "type": "string"
        },
        "errorCategory": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "createdAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "ISO 8601 timestamp"
        },
        "requestedCount": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "sourceKind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "candidates": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "momentSetId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "rank": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "title": {
                "type": "string"
              },
              "category": {
                "type": "string"
              },
              "startMs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "endMs": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "reason": {
                "type": "string"
              },
              "captions": {
                "type": "boolean"
              },
              "status": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "momentSetId",
              "rank",
              "title",
              "category",
              "startMs",
              "endMs",
              "reason",
              "captions",
              "status"
            ],
            "additionalProperties": false
          }
        }
      },
      "required": [
        "id",
        "projectId",
        "status",
        "errorCategory",
        "createdAt",
        "updatedAt",
        "requestedCount",
        "sourceKind",
        "candidates"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "job"
  ],
  "additionalProperties": false
}
401The API key is missing or invalid.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
404The owned job was not found.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
503Job storage is unavailable.
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "requestId": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}

Examples

curl
curl https://prismclip.com/api/v1/jobs/22222222-2222-4222-8222-222222222222 \
  -H "Authorization: Bearer $PRISMCLIP_API_KEY"
TypeScript
const response = await fetch(
  "https://prismclip.com/api/v1/jobs/22222222-2222-4222-8222-222222222222",
  { headers: { Authorization: `Bearer ${process.env.PRISMCLIP_API_KEY}` } }
);
const { job } = await response.json();
Python
import os, requests

response = requests.get(
    "https://prismclip.com/api/v1/jobs/22222222-2222-4222-8222-222222222222",
    headers={"Authorization": f"Bearer {os.environ['PRISMCLIP_API_KEY']}"},
)
job = response.json()["job"]