# Uploads

## Get upload properties for a file

Get upload properties for a file a client wish to upload on TextMaster. Theses properties can then be used to make the HTTP request on the storage provider with the file sent as HTTP form data.

{% hint style="info" %}
**OAuth:** This endpoint requires the default `public` scope.
{% endhint %}

{% openapi src="<https://app.textmaster.com/api-docs/v1/clients/specs.yaml>" path="/v1/clients/upload\_properties" method="post" %}
<https://app.textmaster.com/api-docs/v1/clients/specs.yaml>
{% endopenapi %}

#### **Code samples**

{% tabs %}
{% tab title="HTTP" %}

```shell
curl "https://api.textmaster.com/v1/clients/upload_properties" \
  -X POST \
  --data-urlencode "file_name=my-file.pdf" \
  --data-urlencode "hashed_payload=f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2" \
  -H "Authorization: Bearer 427ba17dc03db4792cd8d3c731ed53addd261b1baa7eef1ceda2cf2ca20f2b79"

# Response:
#
# {
#   "url": "https://storage-proxy.textmaster.com/api-files/uploads/10922fb8-9265-4ef2-92e8-c4177c3b03da/ef9f1ca8/my-file.pdf",
#   "headers": {
#     "x-upload-path": "uploads/10922fb8-9265-4ef2-92e8-c4177c3b03da/ef9e1ca8/my-file.pdf",
#     "x-upload-sha256": "f2ca1bb6c7e907d06dafe4687e579fce76b37e4e39b7605022da52e6ccc26fd2",
#     "x-upload-date": "20500102T123456Z",
#     "Authorization": "78ca271e7f6464961ef3db6903da3d2c51cd4156975322ba678840e12a334de3"
#   }
# }

curl "https://storage-proxy.textmaster.com/api-files/uploads/10922fb8-9265-4ef2-92e8-c4177c3b03da/ef9f1ca8/my-file.pdf" \
  -X PUT \
  -H "x-upload-path: uploads/10922fb8-9265-4ef2-92e8-c4177c3b03da/ef9e1ca8/my-file.pdf" \
  -H "x-upload-sha256: f2ca1bb6c7e907d06dafe4687e579fce76b37e4e39b7605022da52e6ccc26fd2" \
  -H "x-upload-date: 20500102T123456Z" \
  -H "Authorization: 78ca271e7f6464961ef3db6903da3d2c51cd4156975322ba678840e12a334de3" \
  -H "Content-Type: application/pdf" \
  -d "@path/to-the-actual-file/my-file.pdf"
```

{% endtab %}

{% tab title="Ruby" %}
This sample Ruby code requires the `excon` gem to be installed.

```ruby
require 'digest/sha1'
require 'excon'
require 'json'
require 'time'

file_name      = 'my-file.pdf'
file_path      = 'path/to-the-actual-file/my-file.pdf'
file_content   = File.binread(file_path)
hashed_payload = Digest::SHA256.hexdigest(file_content)

apikey = 'YOUR TEXTMASTER API KEY'
apisecret = 'YOUR TEXTMASTER API SECRET'
current_time = Time.now.utc.httpdate
signature = Digest::SHA1.hexdigest(apisecret + current_time)

response = Excon.post(
  'https://api.textmaster.com/v1/clients/upload_properties.json',
  body: URI.encode_www_form(file_name: file_name, hashed_payload: hashed_payload),
  headers: {
    apikey: apikey,
    date: current_time,
    signature: signature,
  }
)

properties = JSON.parse(response.body)
# {
#   "url" => "https://storage-proxy.textmaster.com/api-files/uploads/10922fb8-9265-4ef2-92e8-c4177c3b03da/ef9f1ca8/my-file.pdf",
#   "headers" => {
#     "x-upload-path" => "uploads/10922fb8-9265-4ef2-92e8-c4177c3b03da/ef9e1ca8/my-file.pdf",
#     "x-upload-sha256" => "f2ca1bb6c7e907d06dafe4687e579fce76b37e4e39b7605022da52e6ccc26fd2",
#     "x-upload-date" => "20500102T123456Z",
#     "Authorization" => "78ca271e7f6464961ef3db6903da3d2c51cd4156975322ba678840e12a334de3"
#   }
# }

response = Excon.put(
  properties['url'],
  body: file_content,
  headers: properties['headers'].merge('Content-Type' => 'application/pdf')
)

response.status
#=> 200
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://developer.textmaster.com/reference/uploads.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
