Skip to main content
This guide explains how to upload documents to Raydocs for extraction using the API. The process involves two steps: uploading the file to temporary storage, then associating it with an extraction session.

Upload Flow Overview

Step 1: Get a Signed Upload URL

First, request a signed URL from the Vapor storage endpoint. This URL allows you to upload directly to S3 without routing the file through the API server.
POST /vapor/signed-storage-url HTTP/1.1
Host: api.raydocs.com
Authorization: Bearer <token>
Content-Type: application/json

{
  "visibility": "private"
}

Request Parameters

ParameterTypeRequiredDescription
visibilitystringNoSet to private (default)
The content_type parameter is optional and defaults to application/octet-stream. You don’t need to detect or specify file types.

Response

{
    "uuid": "abc123-def456-ghi789",
    "key": "tmp/abc123-def456-ghi789",
    "url": "https://s3.amazonaws.com/bucket/tmp/abc123...?X-Amz-Signature=...",
    "headers": {
        "Content-Type": "application/octet-stream"
    }
}
The signed URL is valid for a limited time (typically 5 minutes). Upload your file promptly after receiving it.

Step 2: Upload to S3

Use the signed URL to upload your file directly to S3. Include the headers returned in the previous step.
curl -X PUT "${SIGNED_URL}" \
  --data-binary @document.pdf

Step 3: Associate with Session

After the file is uploaded to S3, create a document record and associate it with your extraction session. Use the key from Step 1 to reference the uploaded file.
POST /extractions/sessions/{sessionId}/documents HTTP/1.1
Host: api.raydocs.com
Authorization: Bearer <token>
Content-Type: application/json

{
  "key": "tmp/abc123-def456-ghi789",
  "filename": "invoice_001.pdf"
}

Request Parameters

ParameterTypeRequiredDescription
keystringYesThe key returned from the signed URL request
filenamestringYesOriginal filename for display purposes

Response

{
    "id": "880e8400-e29b-41d4-a716-446655440000",
    "filename": "invoice_001.pdf",
    "status": "uploaded",
    "extraction_session_id": "770e8400-e29b-41d4-a716-446655440000",
    "meta": {},
    "created_at": "2024-01-15T10:30:00Z"
}
Document processing starts automatically after association. The status will progress from uploadedprocessingready.

Complete Example

Here’s a complete example in JavaScript:
async function uploadDocument(sessionId, file, apiToken) {
    // Step 1: Get signed URL
    const signedUrlResponse = await fetch(
        "https://api.raydocs.com/vapor/signed-storage-url",
        {
            method: "POST",
            headers: {
                Authorization: `Bearer ${apiToken}`,
                "Content-Type": "application/json",
            },
            body: JSON.stringify({
                visibility: "private",
            }),
        }
    );

    const { url, key, headers } = await signedUrlResponse.json();

    // Step 2: Upload to S3
    await fetch(url, {
        method: "PUT",
        headers: headers,
        body: file,
    });

    // Step 3: Associate with session
    const documentResponse = await fetch(
        `https://api.raydocs.com/extractions/sessions/${sessionId}/documents`,
        {
            method: "POST",
            headers: {
                Authorization: `Bearer ${apiToken}`,
                "Content-Type": "application/json",
            },
            body: JSON.stringify({
                key: key,
                filename: file.name,
            }),
        }
    );

    return documentResponse.json();
}

Supported File Formats

PDF, images (PNG, JPEG, TIFF), and Office documents (DOCX, PPTX) are supported.

Monitoring Processing Status

After uploading, poll the document endpoint to check processing status:
GET /extractions/documents/{documentId} HTTP/1.1
Host: api.raydocs.com
Authorization: Bearer <token>
Or list all documents in the session:
GET /extractions/sessions/{sessionId}/documents HTTP/1.1
Host: api.raydocs.com
Authorization: Bearer <token>
Wait for all documents to reach ready status before running an extraction. Extracting with processing documents will fail.

Error Handling

Common Upload Errors

ErrorCauseSolution
403 Forbidden on S3Signed URL expiredRequest a new signed URL
413 Payload Too LargeFile exceeds size limitCompress or split the document
422 Unprocessable EntityInvalid keyEnsure you’re using the key from Step 1

Processing Failures

If a document’s status becomes failed:
  1. Check the document’s error message via the GET endpoint
  2. Verify the file is a valid, non-corrupted document
  3. Re-upload if the file was damaged during transfer