A Document is a written, printed, or electronic matter that provides information or evidence or that serves as an official record.

Documents may sometimes be requested to complete underwriting and finalize Payment fulfillment. Examples of Document requests typically involve an invoice detailing the goods and services rendered by a Recipient, a photo of a Payer's government-issued ID, etc.

Plastiq Connect will request Documents via webhook events. More specifically, a Payment webhook will notify you when a Document request has been issued, the requested Document type, and the associated Payment identifiers linked to a customer's transaction.

Here is an example of a Document request:

{
  "id": "dee9427c-3e33-490b-a9f1-9fd16b75a14f",
  "event": "document.request",
  "data": {
    "id": "fc3d3ad3-52ae-45d7-bae0-501d112547ef",
    "object": "PAYMENT",
    "type": "GOVERNMENT_ISSUED_ID",
    "timestamp": 1620080776056
  }
}

Once the webhook event is acknowledged, a Document request can be satisfied by calling the POST Documents endpoint.

Here are some examples of different Document request types:

TypeDescription
SUPPLIER_INVOICE_OR_PURCHASE_ORDERPlastiq needs to understand what goods and/or services are being paid for (usually provided by the vendor/recipient). Plastiq uses the invoice or purchase order to gain an understanding, and verifies that the payment complies with our Terms of Services and the network policies mandated by the card brands (Visa, Mastercard, Amex, etc).
GOVERNMENT_ISSUED_IDPlastiq must verify a user's identity for our KYC process and compliance protocols. Plastiq must also confirm that the owner of the credit card is the same person making the transaction.
CARD_OR_BANK_STATEMENTPlastiq must verify a user's identity for our KYC process and compliance protocols. Plastiq must also confirm that the owner of the funding method is the same person making the transaction.
BENEFICIAL_OWNERPlastiq must obtain the beneficial owner information for all international vendors per payment processor regulations. This information is provided by the payor to Plastiq, and is oftentimes given to the payor by the vendor/recipient.
EMPLOYEE_PAY_OR_CONTRACTPlastiq must verify that the payment is not a peer to peer payment, which is not allowed Plastiq's Terms of Service. Plastiq looks at these documents to confirm that the payment is for payroll, contractor services, etc.
LEGAL_AGREEMENTPlastiq needs to understand what goods and/or services are being paid for. Plastiq reads the legal agreement to gain insights, and verifies that the payment complies with our Terms of Services and the network policies mandated by various card brands. In the case of nuanced or complex payments, Plastiq will use the legal agreement to gain an understanding of the nature and/or relationship between the payment, payor, and payee.
LEASE_AGREEMENTPlastiq is required by some card networks to verify all peer to peer rent transactions, and per payment processor requirements must keep the lease agreement on file.
CERTIFICATE_OF_GOODSPlastiq does not allow payments for goods or services whose delivery or completion has not yet been confirmed. Plastiq must verify that the goods or services provided by the vendor/recipient were rendered to the payor's satisfaction. By providing a certificate of goods, the payor is confirming that no future chargebacks, disputes or claims will be made regarding insufficient or unexpected quality or untimely delivery of the goods and services.
NON_P2P_DOCUMENTPlastiq must verify that the payment is not a peer to peer payment, which is not allowed per Plastiq's Terms of Service. Plastiq needs to ensure that a good and/or service is being rendered and is requesting a document, of the payor's choosing, to demonstrate that the nature of the transaction is related to a good or service rendered.
ESCROW_AGREEMENTPlastiq needs to verify that an escrow agreement is in place between the payor and payee, prior to disbursing funds to a recipient.
W9_FORMPlastiq must verify that the payment is not a peer to peer payment, which is not allowed Plastiq's Terms of Service. Plastiq will review the w9 form as a means to ensure the payment is for a good or service rendered by an industry professional.

Try it out

Sample POST Documents response

{
    "uploadURL": "https://s3.us-west-2.amazonaws.com/artemis-qa-documents-us-west-2",
    "metadata": {
        "Key": "34df7540-3c27-4d8d-8b27-0ca235252e62/e830c9c0-8705-48ff-bbdb-9cf05bc24c0d/0e/0e123696-c209-48ab-bfbf-8b5ed00f2134.jpg",
        "success_action_status": "201",
        "bucket": "artemis-qa-documents-us-west-2",
        "X-Amz-Algorithm": "AWS4-HMAC-SHA256",
        "X-Amz-Credential": "ASIAZXQMQOZ3NS4CFNG4/20220124/us-west-2/s3/aws4_request",
        "X-Amz-Date": "20220124T235319Z",
        "X-Amz-Security-Token": "IQoJb3JpZ2luX2VjEFQaCXVzLXdlc3QtMiJHMEUCICgJtDvFyk07sOLbPkag4X818r7CMHwUFGv5We/38kZMAiEAgupTUiyamYLtUHv+h2XuI8xKLH+lIlsEWHnd1EeUVdIqgQQIfRACGgw2Njg5Njc0MDEwNzgiDAiaLoynlBqp7mdjhireA7ah5Jd81Ac76CZgB97Sx1ObFG8kuZevWEQ07hcEmXxoNkNn90poVoJBX5koDsfGuE+HIz57W+35xg6D51BnT5Vr4yblKYPfXgmRuY+Z6EYMaXj2sH5piAOUNF1AbCDDJ+ltgN8sjc3NpBj4j2bgh33iOdauyCwn2rqJmpuirJUCqtQUFLpjMtXevAt1xRQhu6t6/4hL9hPOklyOqEsEWh4B3a7fl5zZTHOEkB8iYwQEyNG8/D0/W8QfYge64sBIS9jqYzI3bL/GhaNnUO6RWTIBf8Z3UlKGLqbb7UoPlcxLjm0ZZp7coWXHfWYngt5QLBEuA0rKNrDf+ohtLg/4IU6do6dMVKBzWiuFt37cMBZZ0qT43EG08uJ91ZZqZIUNRKhpw4nw3MSp5PW7cy32COganYguiVDQo4AsKXu6XqXTVbtkpYoxAgUO906Qf+Vfu+VuJFikzzclFCYsFqbo9VUpjV3DLrYjWWEbjlApd525Lu+XBJMuz4y57YrSffqH1pXtbaUzz3UOy/mCzH/m0EqNtveqjeJkGOkoSqNY/v7odJI6vvNseOZKaEmtNpsDZ/5xfH5Uhc4P3/Jk/ZUITv16C+O6Fe42MDNm5FJz1/zV1UVD+OEe9ChKkoF6du8w15C8jwY6pQFG6ME/+cSqBr/oJZzo15uawCY5T1U3Y6WQBZEZjY96gshLMsVKQYKSzSfUANt3KX5rjUHN0aAIkcaygpbfJ71AWXUa8GKQlcxl1xG/qodTPwllNaakeWjS+mWlTUGnGsbE3vbIHlQLa11gOlc4qnaTr+ZEBrW5RZ0dmOok+MRd+k96AX091JIyoOLp0bTkhInVGlrkpJGeLklIKlcusJ3zzxyr41Y=",
        "Policy": "eyJleHBpcmF0aW9uIjoiMjAyMi0wMS0yNFQyMzo1ODoxOVoiLCJjb25kaXRpb25zIjpbWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMCw1MDAwMDAwMF0seyJLZXkiOiIzNGRmNzU0MC0zYzI3LTRkOGQtOGIyNy0wY2EyMzUyNTJlNjIvZTgzMGM5YzAtODcwNS00OGZmLWJiZGItOWNmMDViYzI0YzBkLzBlLzBlMTIzNjk2LWMyMDktNDhhYi1iZmJmLThiNWVkMDBmMjEzNC5qcGcifSx7InN1Y2Nlc3NfYWN0aW9uX3N0YXR1cyI6IjIwMSJ9LHsiYnVja2V0IjoiYXJ0ZW1pcy1xYS1kb2N1bWVudHMtdXMtd2VzdC0yIn0seyJYLUFtei1BbGdvcml0aG0iOiJBV1M0LUhNQUMtU0hBMjU2In0seyJYLUFtei1DcmVkZW50aWFsIjoiQVNJQVpYUU1RT1ozTlM0Q0ZORzQvMjAyMjAxMjQvdXMtd2VzdC0yL3MzL2F3czRfcmVxdWVzdCJ9LHsiWC1BbXotRGF0ZSI6IjIwMjIwMTI0VDIzNTMxOVoifSx7IlgtQW16LVNlY3VyaXR5LVRva2VuIjoiSVFvSmIzSnBaMmx1WDJWakVGUWFDWFZ6TFhkbGMzUXRNaUpITUVVQ0lDZ0p0RHZGeWswN3NPTGJQa2FnNFg4MThyN0NNSHdVRkd2NVdlLzM4a1pNQWlFQWd1cFRVaXlhbVlMdFVIditoMlh1STh4S0xIK2xJbHNFV0huZDFFZVVWZElxZ1FRSWZSQUNHZ3cyTmpnNU5qYzBNREV3TnpnaURBaWFMb3lubEJxcDdtZGpoaXJlQTdhaDVKZDgxQWM3NkNaZ0I5N1N4MU9iRkc4a3VaZXZXRVEwN2hjRW1YeG9Oa05uOTBwb1ZvSkJYNWtvRHNmR3VFK0hJejU3VyszNXhnNkQ1MUJuVDVWcjR5YmxLWVBmWGdtUnVZK1o2RVlNYVhqMnNINXBpQU9VTkYxQWJDRERKK2x0Z044c2pjM05wQmo0ajJiZ2gzM2lPZGF1eUN3bjJycUptcHVpckpVQ3F0UVVGTHBqTXRYZXZBdDF4UlFodTZ0Ni80aEw5aFBPa2x5T3FFc0VXaDRCM2E3Zmw1elpUSE9Fa0I4aVl3UUV5Tkc4L0QwL1c4UWZZZ2U2NHNCSVM5anFZekkzYkwvR2hhTm5VTzZSV1RJQmY4WjNVbEtHTHFiYjdVb1BsY3hMam0wWlpwN2NvV1hIZldZbmd0NVFMQkV1QTByS05yRGYrb2h0TGcvNElVNmRvNmRNVktCeldpdUZ0MzdjTUJaWjBxVDQzRUcwOHVKOTFaWnFaSVVOUktocHc0bnczTVNwNVBXN2N5MzJDT2dhbllndWlWRFFvNEFzS1h1NlhxWFRWYnRrcFlveEFnVU85MDZRZitWZnUrVnVKRmlrenpjbEZDWXNGcWJvOVZVcGpWM0RMcllqV1dFYmpsQXBkNTI1THUrWEJKTXV6NHk1N1lyU2ZmcUgxcFh0YmFVenozVU95L21DekgvbTBFcU50dmVxamVKa0dPa29TcU5ZL3Y3b2RKSTZ2dk5zZU9aS2FFbXROcHNEWi81eGZINVVoYzRQMy9Kay9aVUlUdjE2QytPNkZlNDJNRE5tNUZKejEvelYxVVZEK09FZTlDaEtrb0Y2ZHU4dzE1Qzhqd1k2cFFGRzZNRS8rY1NxQnIvb0paem8xNXVhd0NZNVQxVTNZNldRQlpFWmpZOTZnc2hMTXNWS1FZS1N6U2ZVQU50M0tYNXJqVUhOMGFBSWtjYXlncGJmSjcxQVdYVWE4R0tRbGN4bDF4Ry9xb2RUUHdsbE5hYWtlV2pTK21XbFRVR25Hc2JFM3ZiSUhsUUxhMTFnT2xjNHFuYVRyK1pFQnJXNVJaMGRtT29rK01SZCtrOTZBWDA5MUpJeW9PTHAwYlRraEluVkdscmtwSkdlTGtsSUtsY3VzSjN6enh5cjQxWT0ifV19",
        "X-Amz-Signature": "6395b80bcfd03730c078697e58a11302941ac39df4e545bfe372c60d05d0e228"
    }
}

The uploadURL is a pre-signed URL (S3 bucket) to be used in a multipart request when uploading assets. These pre-signed URLs expire after 15 minutes from creation.

Upload your file

  1. Create a POST request to the uploadURL provided from the POST /documents response (as shown above).
  2. Add all fields from the metadata object from the POST /documents response as form-data.
  3. Add the file you would like to upload with the key file as the last record in form-data.
var formdata = new FormData();
formdata.append("Key", "34df7540-3c27-4d8d-8b27-0ca235252e62/e830c9c0-8705-48ff-bbdb-9cf05bc24c0d/0e/0e123696-c209-48ab-bfbf-8b5ed00f2134.jpg");
formdata.append("success_action_status", "201");
formdata.append("bucket", "artemis-qa-documents-us-west-2");
formdata.append("X-Amz-Algorithm", "AWS4-HMAC-SHA256");
formdata.append("X-Amz-Credential", "ASIAZXQMQOZ3NS4CFNG4/20220124/us-west-2/s3/aws4_request");
formdata.append("X-Amz-Date", "20220124T235319Z");
formdata.append("X-Amz-Security-Token", "IQoJb3JpZ2luX2VjEFQaCXVzLXdlc3QtMiJHMEUCICgJtDvFyk07sOLbPkag4X818r7CMHwUFGv5We/38kZMAiEAgupTUiyamYLtUHv+h2XuI8xKLH+lIlsEWHnd1EeUVdIqgQQIfRACGgw2Njg5Njc0MDEwNzgiDAiaLoynlBqp7mdjhireA7ah5Jd81Ac76CZgB97Sx1ObFG8kuZevWEQ07hcEmXxoNkNn90poVoJBX5koDsfGuE+HIz57W+35xg6D51BnT5Vr4yblKYPfXgmRuY+Z6EYMaXj2sH5piAOUNF1AbCDDJ+ltgN8sjc3NpBj4j2bgh33iOdauyCwn2rqJmpuirJUCqtQUFLpjMtXevAt1xRQhu6t6/4hL9hPOklyOqEsEWh4B3a7fl5zZTHOEkB8iYwQEyNG8/D0/W8QfYge64sBIS9jqYzI3bL/GhaNnUO6RWTIBf8Z3UlKGLqbb7UoPlcxLjm0ZZp7coWXHfWYngt5QLBEuA0rKNrDf+ohtLg/4IU6do6dMVKBzWiuFt37cMBZZ0qT43EG08uJ91ZZqZIUNRKhpw4nw3MSp5PW7cy32COganYguiVDQo4AsKXu6XqXTVbtkpYoxAgUO906Qf+Vfu+VuJFikzzclFCYsFqbo9VUpjV3DLrYjWWEbjlApd525Lu+XBJMuz4y57YrSffqH1pXtbaUzz3UOy/mCzH/m0EqNtveqjeJkGOkoSqNY/v7odJI6vvNseOZKaEmtNpsDZ/5xfH5Uhc4P3/Jk/ZUITv16C+O6Fe42MDNm5FJz1/zV1UVD+OEe9ChKkoF6du8w15C8jwY6pQFG6ME/+cSqBr/oJZzo15uawCY5T1U3Y6WQBZEZjY96gshLMsVKQYKSzSfUANt3KX5rjUHN0aAIkcaygpbfJ71AWXUa8GKQlcxl1xG/qodTPwllNaakeWjS+mWlTUGnGsbE3vbIHlQLa11gOlc4qnaTr+ZEBrW5RZ0dmOok+MRd+k96AX091JIyoOLp0bTkhInVGlrkpJGeLklIKlcusJ3zzxyr41Y=");
formdata.append("Policy", "eyJleHBpcmF0aW9uIjoiMjAyMi0wMS0yNFQyMzo1ODoxOVoiLCJjb25kaXRpb25zIjpbWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMCw1MDAwMDAwMF0seyJLZXkiOiIzNGRmNzU0MC0zYzI3LTRkOGQtOGIyNy0wY2EyMzUyNTJlNjIvZTgzMGM5YzAtODcwNS00OGZmLWJiZGItOWNmMDViYzI0YzBkLzBlLzBlMTIzNjk2LWMyMDktNDhhYi1iZmJmLThiNWVkMDBmMjEzNC5qcGcifSx7InN1Y2Nlc3NfYWN0aW9uX3N0YXR1cyI6IjIwMSJ9LHsiYnVja2V0IjoiYXJ0ZW1pcy1xYS1kb2N1bWVudHMtdXMtd2VzdC0yIn0seyJYLUFtei1BbGdvcml0aG0iOiJBV1M0LUhNQUMtU0hBMjU2In0seyJYLUFtei1DcmVkZW50aWFsIjoiQVNJQVpYUU1RT1ozTlM0Q0ZORzQvMjAyMjAxMjQvdXMtd2VzdC0yL3MzL2F3czRfcmVxdWVzdCJ9LHsiWC1BbXotRGF0ZSI6IjIwMjIwMTI0VDIzNTMxOVoifSx7IlgtQW16LVNlY3VyaXR5LVRva2VuIjoiSVFvSmIzSnBaMmx1WDJWakVGUWFDWFZ6TFhkbGMzUXRNaUpITUVVQ0lDZ0p0RHZGeWswN3NPTGJQa2FnNFg4MThyN0NNSHdVRkd2NVdlLzM4a1pNQWlFQWd1cFRVaXlhbVlMdFVIditoMlh1STh4S0xIK2xJbHNFV0huZDFFZVVWZElxZ1FRSWZSQUNHZ3cyTmpnNU5qYzBNREV3TnpnaURBaWFMb3lubEJxcDdtZGpoaXJlQTdhaDVKZDgxQWM3NkNaZ0I5N1N4MU9iRkc4a3VaZXZXRVEwN2hjRW1YeG9Oa05uOTBwb1ZvSkJYNWtvRHNmR3VFK0hJejU3VyszNXhnNkQ1MUJuVDVWcjR5YmxLWVBmWGdtUnVZK1o2RVlNYVhqMnNINXBpQU9VTkYxQWJDRERKK2x0Z044c2pjM05wQmo0ajJiZ2gzM2lPZGF1eUN3bjJycUptcHVpckpVQ3F0UVVGTHBqTXRYZXZBdDF4UlFodTZ0Ni80aEw5aFBPa2x5T3FFc0VXaDRCM2E3Zmw1elpUSE9Fa0I4aVl3UUV5Tkc4L0QwL1c4UWZZZ2U2NHNCSVM5anFZekkzYkwvR2hhTm5VTzZSV1RJQmY4WjNVbEtHTHFiYjdVb1BsY3hMam0wWlpwN2NvV1hIZldZbmd0NVFMQkV1QTByS05yRGYrb2h0TGcvNElVNmRvNmRNVktCeldpdUZ0MzdjTUJaWjBxVDQzRUcwOHVKOTFaWnFaSVVOUktocHc0bnczTVNwNVBXN2N5MzJDT2dhbllndWlWRFFvNEFzS1h1NlhxWFRWYnRrcFlveEFnVU85MDZRZitWZnUrVnVKRmlrenpjbEZDWXNGcWJvOVZVcGpWM0RMcllqV1dFYmpsQXBkNTI1THUrWEJKTXV6NHk1N1lyU2ZmcUgxcFh0YmFVenozVU95L21DekgvbTBFcU50dmVxamVKa0dPa29TcU5ZL3Y3b2RKSTZ2dk5zZU9aS2FFbXROcHNEWi81eGZINVVoYzRQMy9Kay9aVUlUdjE2QytPNkZlNDJNRE5tNUZKejEvelYxVVZEK09FZTlDaEtrb0Y2ZHU4dzE1Qzhqd1k2cFFGRzZNRS8rY1NxQnIvb0paem8xNXVhd0NZNVQxVTNZNldRQlpFWmpZOTZnc2hMTXNWS1FZS1N6U2ZVQU50M0tYNXJqVUhOMGFBSWtjYXlncGJmSjcxQVdYVWE4R0tRbGN4bDF4Ry9xb2RUUHdsbE5hYWtlV2pTK21XbFRVR25Hc2JFM3ZiSUhsUUxhMTFnT2xjNHFuYVRyK1pFQnJXNVJaMGRtT29rK01SZCtrOTZBWDA5MUpJeW9PTHAwYlRraEluVkdscmtwSkdlTGtsSUtsY3VzSjN6enh5cjQxWT0ifV19");
formdata.append("X-Amz-Signature", "6395b80bcfd03730c078697e58a11302941ac39df4e545bfe372c60d05d0e228");
formdata.append("file", fileInput.files[0], "documents.jpg");

var requestOptions = {
  method: 'POST',
  body: formdata,
  redirect: 'follow'
};

fetch("https://s3.us-west-2.amazonaws.com/artemis-qa-documents-us-west-2", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
import http.client
import mimetypes
from codecs import encode

conn = http.client.HTTPSConnection("s3.us-west-2.amazonaws.com")
dataList = []
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T'
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=Key;'))

dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))

dataList.append(encode("34df7540-3c27-4d8d-8b27-0ca235252e62/e830c9c0-8705-48ff-bbdb-9cf05bc24c0d/0e/0e123696-c209-48ab-bfbf-8b5ed00f2134.jpg"))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=success_action_status;'))

dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))

dataList.append(encode("201"))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=bucket;'))

dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))

dataList.append(encode("artemis-qa-documents-us-west-2"))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=X-Amz-Algorithm;'))

dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))

dataList.append(encode("AWS4-HMAC-SHA256"))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=X-Amz-Credential;'))

dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))

dataList.append(encode("ASIAZXQMQOZ3NS4CFNG4/20220124/us-west-2/s3/aws4_request"))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=X-Amz-Date;'))

dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))

dataList.append(encode("20220124T235319Z"))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=X-Amz-Security-Token;'))

dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))

dataList.append(encode("IQoJb3JpZ2luX2VjEFQaCXVzLXdlc3QtMiJHMEUCICgJtDvFyk07sOLbPkag4X818r7CMHwUFGv5We/38kZMAiEAgupTUiyamYLtUHv+h2XuI8xKLH+lIlsEWHnd1EeUVdIqgQQIfRACGgw2Njg5Njc0MDEwNzgiDAiaLoynlBqp7mdjhireA7ah5Jd81Ac76CZgB97Sx1ObFG8kuZevWEQ07hcEmXxoNkNn90poVoJBX5koDsfGuE+HIz57W+35xg6D51BnT5Vr4yblKYPfXgmRuY+Z6EYMaXj2sH5piAOUNF1AbCDDJ+ltgN8sjc3NpBj4j2bgh33iOdauyCwn2rqJmpuirJUCqtQUFLpjMtXevAt1xRQhu6t6/4hL9hPOklyOqEsEWh4B3a7fl5zZTHOEkB8iYwQEyNG8/D0/W8QfYge64sBIS9jqYzI3bL/GhaNnUO6RWTIBf8Z3UlKGLqbb7UoPlcxLjm0ZZp7coWXHfWYngt5QLBEuA0rKNrDf+ohtLg/4IU6do6dMVKBzWiuFt37cMBZZ0qT43EG08uJ91ZZqZIUNRKhpw4nw3MSp5PW7cy32COganYguiVDQo4AsKXu6XqXTVbtkpYoxAgUO906Qf+Vfu+VuJFikzzclFCYsFqbo9VUpjV3DLrYjWWEbjlApd525Lu+XBJMuz4y57YrSffqH1pXtbaUzz3UOy/mCzH/m0EqNtveqjeJkGOkoSqNY/v7odJI6vvNseOZKaEmtNpsDZ/5xfH5Uhc4P3/Jk/ZUITv16C+O6Fe42MDNm5FJz1/zV1UVD+OEe9ChKkoF6du8w15C8jwY6pQFG6ME/+cSqBr/oJZzo15uawCY5T1U3Y6WQBZEZjY96gshLMsVKQYKSzSfUANt3KX5rjUHN0aAIkcaygpbfJ71AWXUa8GKQlcxl1xG/qodTPwllNaakeWjS+mWlTUGnGsbE3vbIHlQLa11gOlc4qnaTr+ZEBrW5RZ0dmOok+MRd+k96AX091JIyoOLp0bTkhInVGlrkpJGeLklIKlcusJ3zzxyr41Y="))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=Policy;'))

dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))

dataList.append(encode("eyJleHBpcmF0aW9uIjoiMjAyMi0wMS0yNFQyMzo1ODoxOVoiLCJjb25kaXRpb25zIjpbWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMCw1MDAwMDAwMF0seyJLZXkiOiIzNGRmNzU0MC0zYzI3LTRkOGQtOGIyNy0wY2EyMzUyNTJlNjIvZTgzMGM5YzAtODcwNS00OGZmLWJiZGItOWNmMDViYzI0YzBkLzBlLzBlMTIzNjk2LWMyMDktNDhhYi1iZmJmLThiNWVkMDBmMjEzNC5qcGcifSx7InN1Y2Nlc3NfYWN0aW9uX3N0YXR1cyI6IjIwMSJ9LHsiYnVja2V0IjoiYXJ0ZW1pcy1xYS1kb2N1bWVudHMtdXMtd2VzdC0yIn0seyJYLUFtei1BbGdvcml0aG0iOiJBV1M0LUhNQUMtU0hBMjU2In0seyJYLUFtei1DcmVkZW50aWFsIjoiQVNJQVpYUU1RT1ozTlM0Q0ZORzQvMjAyMjAxMjQvdXMtd2VzdC0yL3MzL2F3czRfcmVxdWVzdCJ9LHsiWC1BbXotRGF0ZSI6IjIwMjIwMTI0VDIzNTMxOVoifSx7IlgtQW16LVNlY3VyaXR5LVRva2VuIjoiSVFvSmIzSnBaMmx1WDJWakVGUWFDWFZ6TFhkbGMzUXRNaUpITUVVQ0lDZ0p0RHZGeWswN3NPTGJQa2FnNFg4MThyN0NNSHdVRkd2NVdlLzM4a1pNQWlFQWd1cFRVaXlhbVlMdFVIditoMlh1STh4S0xIK2xJbHNFV0huZDFFZVVWZElxZ1FRSWZSQUNHZ3cyTmpnNU5qYzBNREV3TnpnaURBaWFMb3lubEJxcDdtZGpoaXJlQTdhaDVKZDgxQWM3NkNaZ0I5N1N4MU9iRkc4a3VaZXZXRVEwN2hjRW1YeG9Oa05uOTBwb1ZvSkJYNWtvRHNmR3VFK0hJejU3VyszNXhnNkQ1MUJuVDVWcjR5YmxLWVBmWGdtUnVZK1o2RVlNYVhqMnNINXBpQU9VTkYxQWJDRERKK2x0Z044c2pjM05wQmo0ajJiZ2gzM2lPZGF1eUN3bjJycUptcHVpckpVQ3F0UVVGTHBqTXRYZXZBdDF4UlFodTZ0Ni80aEw5aFBPa2x5T3FFc0VXaDRCM2E3Zmw1elpUSE9Fa0I4aVl3UUV5Tkc4L0QwL1c4UWZZZ2U2NHNCSVM5anFZekkzYkwvR2hhTm5VTzZSV1RJQmY4WjNVbEtHTHFiYjdVb1BsY3hMam0wWlpwN2NvV1hIZldZbmd0NVFMQkV1QTByS05yRGYrb2h0TGcvNElVNmRvNmRNVktCeldpdUZ0MzdjTUJaWjBxVDQzRUcwOHVKOTFaWnFaSVVOUktocHc0bnczTVNwNVBXN2N5MzJDT2dhbllndWlWRFFvNEFzS1h1NlhxWFRWYnRrcFlveEFnVU85MDZRZitWZnUrVnVKRmlrenpjbEZDWXNGcWJvOVZVcGpWM0RMcllqV1dFYmpsQXBkNTI1THUrWEJKTXV6NHk1N1lyU2ZmcUgxcFh0YmFVenozVU95L21DekgvbTBFcU50dmVxamVKa0dPa29TcU5ZL3Y3b2RKSTZ2dk5zZU9aS2FFbXROcHNEWi81eGZINVVoYzRQMy9Kay9aVUlUdjE2QytPNkZlNDJNRE5tNUZKejEvelYxVVZEK09FZTlDaEtrb0Y2ZHU4dzE1Qzhqd1k2cFFGRzZNRS8rY1NxQnIvb0paem8xNXVhd0NZNVQxVTNZNldRQlpFWmpZOTZnc2hMTXNWS1FZS1N6U2ZVQU50M0tYNXJqVUhOMGFBSWtjYXlncGJmSjcxQVdYVWE4R0tRbGN4bDF4Ry9xb2RUUHdsbE5hYWtlV2pTK21XbFRVR25Hc2JFM3ZiSUhsUUxhMTFnT2xjNHFuYVRyK1pFQnJXNVJaMGRtT29rK01SZCtrOTZBWDA5MUpJeW9PTHAwYlRraEluVkdscmtwSkdlTGtsSUtsY3VzSjN6enh5cjQxWT0ifV19"))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=X-Amz-Signature;'))

dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))

dataList.append(encode("6395b80bcfd03730c078697e58a11302941ac39df4e545bfe372c60d05d0e228"))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=file; filename={0}'.format('documents.jpg')))

fileType = mimetypes.guess_type('~/documents.jpg')[0] or 'application/octet-stream'
dataList.append(encode('Content-Type: {}'.format(fileType)))
dataList.append(encode(''))

with open('~/documents.jpg', 'rb') as f:
  dataList.append(f.read())
dataList.append(encode('--'+boundary+'--'))
dataList.append(encode(''))
body = b'\r\n'.join(dataList)
payload = body
headers = {
   'Content-type': 'multipart/form-data; boundary={}'.format(boundary) 
}
conn.request("POST", "/artemis-qa-documents-us-west-2", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))

Sample success response from S3

<?xml version="1.0" encoding="UTF-8"?>
<PostResponse>
    <Location>https://s3.us-west-2.amazonaws.com/artemis-qa-documents-us-west-2/34df7540-3c27-4d8d-8b27-0ca235252e62/e830c9c0-8705-48ff-bbdb-9cf05bc24c0d/0e/0e123696-c209-48ab-bfbf-8b5ed00f2134.jpg</Location>
    <Bucket>artemis-qa-documents-us-west-2</Bucket>
    <Key>34df7540-3c27-4d8d-8b27-0ca235252e62/e830c9c0-8705-48ff-bbdb-9cf05bc24c0d/0e/0e123696-c209-48ab-bfbf-8b5ed00f2134.jpg</Key>
    <ETag>"f9092a7d80a82e18da7e2cb894a49676"</ETag>
</PostResponse>