Skip to main content

Python Examples

All examples use the requests library. Install it with pip install requests.
pip install requests
Set your API key as an environment variable:
export AGENTDROP_API_KEY="agd_live_xxxxxxxxxxxxxxxxxxxx"

Helper Setup

import os
import requests

BASE_URL = "https://agentdrop-production.up.railway.app"
API_KEY = os.environ["AGENTDROP_API_KEY"]
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

Upload a Single File

def upload_file(filepath, sender, recipient, expires_in="24h"):
    with open(filepath, "rb") as f:
        response = requests.post(
            f"{BASE_URL}/v1/transfers",
            headers=HEADERS,
            data={
                "sender": sender,
                "recipient": recipient,
                "expires_in": expires_in,
            },
            files={"files": f},
        )
    response.raise_for_status()
    return response.json()

transfer = upload_file("report.pdf", "research-agent", "analysis-agent")
print(f"Transfer ID: {transfer['id']}")
print(f"Expires at: {transfer['expires_at']}")

Upload Multiple Files

def upload_files(filepaths, sender, recipient, encrypted=False):
    files = [("files", (os.path.basename(fp), open(fp, "rb"))) for fp in filepaths]

    response = requests.post(
        f"{BASE_URL}/v1/transfers",
        headers=HEADERS,
        data={
            "sender": sender,
            "recipient": recipient,
            "encrypted": str(encrypted).lower(),
        },
        files=files,
    )
    response.raise_for_status()

    # Close file handles
    for _, (_, fh) in files:
        fh.close()

    return response.json()

transfer = upload_files(
    ["data.csv", "metadata.json"],
    sender="etl-pipeline",
    recipient="dashboard-agent",
    encrypted=True,
)

Download a Transfer

def download_transfer(transfer_id, output_path):
    response = requests.get(
        f"{BASE_URL}/v1/transfers/{transfer_id}/download",
        headers=HEADERS,
    )
    response.raise_for_status()

    with open(output_path, "wb") as f:
        f.write(response.content)

    remaining = response.headers.get("X-Downloads-Remaining", "unknown")
    print(f"Saved to {output_path} ({remaining} downloads remaining)")

download_transfer("txfr_abc123", "report.pdf")

Check Transfer Status

def get_transfer(transfer_id):
    response = requests.get(
        f"{BASE_URL}/v1/transfers/{transfer_id}",
        headers=HEADERS,
    )
    response.raise_for_status()
    return response.json()

transfer = get_transfer("txfr_abc123")
print(f"Status: {transfer['status']}")
print(f"Downloads: {transfer['download_count']}/{transfer['max_downloads']}")

List All Transfers

def list_transfers(page=1, limit=20):
    response = requests.get(
        f"{BASE_URL}/v1/transfers",
        headers=HEADERS,
        params={"page": page, "limit": limit},
    )
    response.raise_for_status()
    return response.json()

result = list_transfers()
for t in result["data"]:
    print(f"{t['id']} | {t['status']} | {t['sender']} -> {t['recipient']}")

Delete a Transfer

def delete_transfer(transfer_id):
    response = requests.delete(
        f"{BASE_URL}/v1/transfers/{transfer_id}",
        headers=HEADERS,
    )
    response.raise_for_status()
    return response.json()

result = delete_transfer("txfr_abc123")
print(f"Deleted: {result['status']}")

Full Send-and-Receive Flow

End-to-end example: one agent uploads, another downloads.
import os
import requests
import time

BASE_URL = "https://agentdrop-production.up.railway.app"
API_KEY = os.environ["AGENTDROP_API_KEY"]
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

# --- Sender Agent ---
def sender_workflow():
    with open("quarterly-report.pdf", "rb") as f:
        response = requests.post(
            f"{BASE_URL}/v1/transfers",
            headers=HEADERS,
            data={
                "sender": "finance-agent",
                "recipient": "exec-summary-agent",
                "expires_in": "12h",
                "max_downloads": "3",
            },
            files={"files": f},
        )
    response.raise_for_status()
    transfer = response.json()
    print(f"Uploaded. Transfer ID: {transfer['id']}")
    return transfer["id"]

# --- Receiver Agent ---
def receiver_workflow(transfer_id):
    # Check status first
    status_resp = requests.get(
        f"{BASE_URL}/v1/transfers/{transfer_id}",
        headers=HEADERS,
    )
    transfer = status_resp.json()

    if transfer["status"] != "active":
        print(f"Transfer not available: {transfer['status']}")
        return

    # Download
    dl_resp = requests.get(
        f"{BASE_URL}/v1/transfers/{transfer_id}/download",
        headers=HEADERS,
    )
    dl_resp.raise_for_status()

    with open("received-report.pdf", "wb") as f:
        f.write(dl_resp.content)

    print("File received and saved.")

# Run the flow
transfer_id = sender_workflow()
receiver_workflow(transfer_id)

Error Handling

def safe_upload(filepath, sender, recipient):
    try:
        with open(filepath, "rb") as f:
            response = requests.post(
                f"{BASE_URL}/v1/transfers",
                headers=HEADERS,
                data={"sender": sender, "recipient": recipient},
                files={"files": f},
            )
        response.raise_for_status()
        return response.json()
    except requests.exceptions.HTTPError as e:
        if e.response.status_code == 413:
            print("File too large for your plan. Upgrade at https://agent-drop.com/pricing")
        elif e.response.status_code == 429:
            print("Rate limited. Waiting 60 seconds...")
            time.sleep(60)
            return safe_upload(filepath, sender, recipient)
        else:
            print(f"HTTP error: {e.response.status_code}{e.response.text}")
        return None