Skip to main content

Upload a file

The File Upload API allows you to programmatically manage files in your File Upload connectors. This guide explains how to use the API to list, upload, and delete files.

Prerequisites

Before using the File Upload API, you need:

  1. A Vectorize account with API access
  2. An API token (see Managing Access Tokens)
  3. Your organization ID (found in the URL of the Vectorize platform)
  4. A File Upload connector ID (created either through the UI or API)

Authentication

All API requests require authentication using your API token. Set the token in the Authorization header of your requests:

Authorization: your-token-here

API Endpoints

The base URL for the Vectorize API is:

https://api.vectorize.io/v1

Listing Files

To list all files in a connector, use the following endpoint:

GET /org/{org_id}/uploads/{connector_id}/files

Example

import os
import requests

# Authentication
token = os.getenv("VECTORIZE_TOKEN")
base_url = "https://api.vectorize.io/v1"

def list_files(org_id: str, connector_id: str):
"""
List files in the specified connector.

:param org_id: Your organization ID
:param connector_id: The ID of the connector to list files for
:return: The list of files
"""
url = f"{base_url}/org/{org_id}/uploads/{connector_id}/files"
headers = {"Authorization": token}

response = requests.get(url, headers=headers)
if response.status_code == 200:
files = response.json()
print(f"Files in connector {connector_id}: {files}")
return files
else:
print(f"Error listing files: {response.status_code}")
print(response.text)
return []

Response

A successful response will return a JSON object containing the list of files:

{
"files": [
{
"name": "example.pdf",
"size": 1234567,
"contentType": "application/pdf",
"uploadDate": "2023-05-01T12:34:56Z",
"metadata": {
"field-1": "example-value"
}
},
// Additional files...
]
}

Uploading Files

Uploading a file is a two-step process:

  1. Initiate the upload to get a pre-signed URL
  2. Upload the file content to the pre-signed URL

Step 1: Initiate the Upload

PUT /org/{org_id}/uploads/{connector_id}/files

Request Body

{
"name": "filename.pdf",
"contentType": "application/pdf",
"metadata": {
"field-1": "example-value",
"field-2": ["value1", "value2"],
"field-3": {"nested": "value"}
}
}

The metadata field is optional and can be used to store additional information about the file.

Step 2: Upload to Pre-signed URL

Use the URL returned from Step 1 to upload the file content.

Example

import os
import requests
import json
import mimetypes

# Authentication
token = os.getenv("VECTORIZE_TOKEN")
base_url = "https://api.vectorize.io/v1"

def upload_file(org_id: str, connector_id: str, file_path: str, metadata: dict = None):
"""
Upload a file to the specified connector with optional metadata.

:param org_id: Your organization ID
:param connector_id: The ID of the connector to upload the file to
:param file_path: The path to the file to upload
:param metadata: Optional metadata to include with the upload
:return: None
"""
# Endpoint for direct file upload
url = f"{base_url}/org/{org_id}/uploads/{connector_id}/files"

# Set headers
headers = {
"Authorization": token,
"Content-Type": "application/json"
}

# Determine file name and content type
file_name = os.path.basename(file_path)
content_type = mimetypes.guess_type(file_path)[0] or "application/octet-stream"

# Prepare the request body
request_body = {
"name": file_name,
"contentType": content_type
}

# Add metadata if provided
if metadata:
request_body["metadata"] = json.dumps(metadata)

# Send PUT request with JSON body to initiate the upload
put_response = requests.put(url, headers=headers, json=request_body)

if put_response.status_code != 200:
print(f"Error starting upload: {put_response.status_code}")
print(put_response.text)
return

# Get upload URL from response
upload_data = put_response.json()
upload_url = upload_data.get("uploadUrl")

if not upload_url:
print("Error: No upload URL received")
print(upload_data)
return

# Now upload the actual file to the provided URL
with open(file_path, "rb") as file:
upload_headers = {
"Content-Type": content_type
}
upload_response = requests.put(upload_url, headers=upload_headers, data=file)

if upload_response.status_code == 200:
print("File uploaded successfully")
else:
print(f"Error uploading file: {upload_response.status_code}")
print(upload_response.text)

Response from Step 1

{
"uploadUrl": "https://presigned-url-for-upload.example.com",
"fileName": "filename.pdf"
}

Deleting Files

To delete a file from a connector, use the following endpoint:

DELETE /org/{org_id}/uploads/{connector_id}/files

Request Body

{
"fileName": "filename.pdf"
}

Example

import os
import requests

# Authentication
token = os.getenv("VECTORIZE_TOKEN")
base_url = "https://api.vectorize.io/v1"

def delete_file(org_id: str, connector_id: str, file_name: str):
"""
Delete a file from the specified connector.

:param org_id: Your organization ID
:param connector_id: The ID of the connector to delete the file from
:param file_name: The name of the file to delete
:return: None
"""
url = f"{base_url}/org/{org_id}/uploads/{connector_id}/files"
headers = {"Authorization": token}

response = requests.delete(url, headers=headers, json={"fileName": file_name})
if response.status_code == 200:
print("File deleted successfully:", response.json())
else:
print(f"Error deleting file: {response.status_code}")
print(response.text)

Response

{
"success": true,
"message": "File deleted successfully"
}

Complete Example

Here's a complete example that demonstrates listing files, uploading a file with metadata, and deleting a file:

import os
import requests
import json
import mimetypes

# Authentication and configuration
token = os.getenv("VECTORIZE_TOKEN")
base_url = "https://api.vectorize.io/v1"
org_id = "your-organization-id"
connector_id = "your-connector-id"
file_path = "path/to/your/file.pdf"

# Example metadata
metadata = {
"field-1": "example-value",
"field-2": ["value1", "value2"],
"field-3": {"nested": "value"}
}

def list_files(org_id: str, connector_id: str):
"""List files in the specified connector."""
url = f"{base_url}/org/{org_id}/uploads/{connector_id}/files"
headers = {"Authorization": token}

response = requests.get(url, headers=headers)
if response.status_code == 200:
files = response.json()
print(f"Files in connector {connector_id}: {files}")
return files
else:
print(f"Error listing files: {response.status_code}")
print(response.text)
return []

def upload_file(org_id: str, connector_id: str, file_path: str, metadata: dict = None):
"""Upload a file to the specified connector with optional metadata."""
url = f"{base_url}/org/{org_id}/uploads/{connector_id}/files"

headers = {
"Authorization": token,
"Content-Type": "application/json"
}

file_name = os.path.basename(file_path)
content_type = mimetypes.guess_type(file_path)[0] or "application/octet-stream"

request_body = {
"name": file_name,
"contentType": content_type
}

if metadata:
request_body["metadata"] = json.dumps(metadata)

put_response = requests.put(url, headers=headers, json=request_body)

if put_response.status_code != 200:
print(f"Error starting upload: {put_response.status_code}")
print(put_response.text)
return

upload_data = put_response.json()
upload_url = upload_data.get("uploadUrl")

if not upload_url:
print("Error: No upload URL received")
print(upload_data)
return

with open(file_path, "rb") as file:
upload_headers = {
"Content-Type": content_type
}
upload_response = requests.put(upload_url, headers=upload_headers, data=file)

if upload_response.status_code == 200:
print("File uploaded successfully")
else:
print(f"Error uploading file: {upload_response.status_code}")
print(upload_response.text)

def delete_file(org_id: str, connector_id: str, file_name: str):
"""Delete a file from the specified connector."""
url = f"{base_url}/org/{org_id}/uploads/{connector_id}/files"
headers = {"Authorization": token}

response = requests.delete(url, headers=headers, json={"fileName": file_name})
if response.status_code == 200:
print("File deleted successfully:", response.json())
else:
print(f"Error deleting file: {response.status_code}")
print(response.text)

# Example usage
if __name__ == "__main__":
try:
# List files before any action
print("Listing files before any action:")
list_files(org_id, connector_id)

# Upload file without metadata
print("\nUploading file without metadata:")
upload_file(org_id, connector_id, file_path)

# List files after upload without metadata
print("\nListing files after upload without metadata:")
list_files(org_id, connector_id)

# Delete file
print("\nDeleting file:")
file_name = os.path.basename(file_path)
delete_file(org_id, connector_id, file_name)

# List files after deletion
print("\nListing files after deletion:")
list_files(org_id, connector_id)

# Upload file with metadata
print("\nUploading file with metadata:")
upload_file(org_id, connector_id, file_path, metadata)

# List files after upload with metadata
print("\nListing files after upload with metadata:")
list_files(org_id, connector_id)

# Delete file
print("\nDeleting file:")
delete_file(org_id, connector_id, file_name)

# List files after deletion
print("\nListing files after deletion:")
list_files(org_id, connector_id)

except Exception as e:
print(f"Error: {e}")

API Reference

For a complete reference of the File Upload API, see the Vectorize API Reference.

Was this page helpful?