API Overview

The Filewall API is a file processing RESTful API that converts an uploaded file into a secure format by opening it in an encrypted environment, taking screenshots, and converting the screenshots to PDF or another format.

Similar to a fax, this ensures that any malicious content is removed and the end-user receives a clean file.

A typical use case for Filewall is to clean all incoming email attachments to a mail server.


The general workflow is as follows:

  1. Use the Authorize endpoint to request an upload URL.
  2. Use the Upload endpoint to upload the file to the upload URL.
  3. Call the Status endpoint to view the file processing status. Options are:

    • If the status is either Waiting or Processing, repeat the call in five seconds.
    • If the status is Finished, a download URL is displayed.
  4. Call the Download endpoint to receive the processed file.


The Filewall API requires a valid API key passed in the header of the initial request, as well as when calling the status of a file being processed. To obtain an API key:

  1. Go to https://filewall.io
  2. Log in to your account. If you don't have an account, sign up for a free account.
  3. Click [your email address] > Account Settings > Show API Key

Uploading a file

  1. To request a new upload URL, send a POST request to the Authorize endpoint. See Authorize for details.
  2. Copy the URL in the links.upload field on the response body.
  3. Send a POST request to the Upload endpoint. See Upload for details.

Get file status

  1. Send a GET request to the Status endpoint using the links.self URL returned in the response body of the successful Authorize request.
  2. If the file is still processing, wait five seconds before repeating the call.

Downloading a file

  1. If the file has finished processing, visit the URL in the links.download field in the response body of the Status endpoint to download the converted file.

If you run into errors when uploading or requesting an upload URL, contact Filewall Support.

Code Samples

Example implementations are available on Github

Any thoughts? Did we miss something? Drop us a note!