> ## Documentation Index
> Fetch the complete documentation index at: https://developer.pdf.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Upload File via Pre-signed URL (API Tester)

> Paste the complete generated presignedUrl and upload a local file as raw bytes.

> [!NOTE]
>
> **Where is my uploaded file?** This PUT normally returns HTTP 200 with an empty body and no file URL. To open, download, or process the file, use the `url` returned by the first GET request. The `presignedUrl` pasted here is the upload destination, not the access link.

> [!NOTE]
>
> **Step 1:** [Generate a pre-signed URL](https://developer.pdf.co/api-tester/file-upload/generate-presigned-url.md) with `contenttype=application/octet-stream`. Save both returned links.

1. Paste the entire `presignedUrl` into the URL field, including its query string. Do not paste the access `url`, remove query parameters, decode values, or append a slash.
2. Select the file from your computer and send the PUT. This request sends raw file bytes with `Content-Type: application/octet-stream`. Do not add your PDF.co API key.
3. HTTP 200 with an empty body means storage accepted the upload. Use the original access `url` for subsequent PDF.co requests.

If the signed URL expires, generate a new one and paste it here. If storage rejects the signature, check that the URL is complete and that the generation content type matches this upload.

[Full PUT reference](https://developer.pdf.co/api/file-upload/upload-presigned-url-put.md). The documented [100 MB processing guidance](https://developer.pdf.co/api/url-input-and-request-limits.md) still applies to each input file.


## OpenAPI

````yaml /openapi.json put /
openapi: 3.0.1
info:
  title: PDF.co API
  description: ''
  version: '1.0'
servers:
  - url: https://api.pdf.co
security:
  - ApiKeyAuth: []
tags:
  - name: Extraction
  - name: Editing
  - name: PDF Conversion
  - name: Excel Conversion
  - name: PDF Merging & Splitting
  - name: Forms
  - name: Find & Search
  - name: Document, File & System
  - name: Pages
  - name: Barcodes
paths:
  /:
    put:
      tags:
        - Document, File & System
      summary: Upload File via Pre-signed URL
      operationId: put_presigned_storage_file
      requestBody:
        required: true
        description: >-
          The selected local file, sent as raw bytes rather than multipart form
          data or a file path.
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
      responses:
        '200':
          description: >-
            Storage accepted the upload. The response body is normally empty; no
            new access URL is returned.
        '403':
          description: >-
            Storage rejected the URL, for example because it expired or its
            signature/content type does not match. Inspect the returned storage
            error.
      security: []
      servers:
        - url: '{presignedUrl}#'
          variables:
            presignedUrl:
              default: >-
                https://pdf-temp-files.s3.us-west-2.amazonaws.com/example/sample.pdf?X-Amz-Signature=REPLACE_WITH_GENERATED_URL
              description: >-
                Paste the complete presignedUrl returned by GET, including the
                query string. Do not split or decode its parameters.
      x-codeSamples:
        - lang: cURL
          label: cURL
          source: |-
            curl --request PUT "PASTE_COMPLETE_PRESIGNED_URL_HERE" \
              --header "Content-Type: application/octet-stream" \
              --data-binary "@sample.pdf"
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.