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

# Create a DirectUpload

> Create a `DirectUpload`.

The `checksum` _must_ be calculated exactly the way `rails` expects it ([javascript example](https://github.com/rails/rails/blob/main/activestorage/app/javascript/activestorage/file_checksum.js)).

You should upload the file to `direct_upload.url` using any provided headers from `direct_upload.headers`.

Once this is done you can use `signed_id` in place of a file in any endpoint that accepts file uploads.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/direct_uploads
openapi: 3.0.3
info:
  title: Horizon API V1
  version: '1.0'
  contact:
    name: Tread
    url: https://tread.io
    email: developers@tread.io
  description: >-
    This is the Version 1 implementation.


    When in doubt we default to the practices outlined
    [here](https://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#advanced-queries)
  license:
    name: Private
    url: https://tread.io
servers:
  - description: production
    url: https://api.tread-horizon.com
security:
  - bearerAuth: []
tags:
  - name: Projects
  - name: Orders
  - name: Loads
  - name: Jobs
  - name: JobAssignments
  - name: ApprovalAssignments
  - name: Equipment
  - name: FuelSurcharges
  - name: Materials
  - name: Accounts
  - name: Tickets
  - name: Users
  - name: Sites
  - name: Companies
  - name: Departments
  - name: Rates
  - name: Services
  - name: EquipmentType
  - name: FileAttachments
  - name: MaterialType
  - name: LineItemType
  - name: DriverStateEvent
  - name: Authentication
  - name: IamRoles
  - name: Typeaheads
  - name: Integrations
  - name: Reflection
  - name: LoadCycles
  - name: AddOns
  - name: ServiceClass
  - name: Invoices
  - name: JobSummaries
  - name: LoadSummaries
  - name: CompanyShares
  - name: UserDevicePermission
  - name: Drivers
  - name: Settlements
  - name: LocationHistories
  - name: Telematics
  - name: OmniReports
  - name: DriverDays
  - name: Agave
  - name: AddOnCharges
  - name: ResourceUsageLogs
  - name: ResourceScopes
  - name: TravelledDistances
  - name: MaterialRates
  - name: CompanyDayJobStats
  - name: KMLFiles
  - name: AutoAddOnAssignments
  - name: SiteRateSchedules
  - name: TwilioIntegrations
  - name: Foremen
  - name: AccountExternalTruckIdentifier
  - name: GeofenceTriggers
  - name: Labels
  - name: Compliance
  - name: ComplianceDocuments
paths:
  /v1/direct_uploads:
    parameters:
      - $ref: '#/components/parameters/Accept-Language'
    post:
      tags:
        - FileAttachments
        - Tickets
        - Companies
      summary: Create a DirectUpload
      description: >-
        Create a `DirectUpload`.


        The `checksum` _must_ be calculated exactly the way `rails` expects it
        ([javascript
        example](https://github.com/rails/rails/blob/main/activestorage/app/javascript/activestorage/file_checksum.js)).


        You should upload the file to `direct_upload.url` using any provided
        headers from `direct_upload.headers`.


        Once this is done you can use `signed_id` in place of a file in any
        endpoint that accepts file uploads.
      operationId: post-v1-direct_uploads
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DirectUpload-Create'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    $ref: '#/components/schemas/DirectUpload-Read'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '406':
          $ref: '#/components/responses/Error'
        '415':
          $ref: '#/components/responses/Error'
        '422':
          $ref: '#/components/responses/ModelError'
components:
  parameters:
    Accept-Language:
      name: Accept-Language
      in: header
      schema:
        type: string
        default: en
        example: en
      description: >-
        The Accept-Language request HTTP header indicates the natural language
        and locale that the client prefers. 
  schemas:
    DirectUpload-Create:
      title: DirectUpload-Create
      x-stoplight:
        id: gu4eq95ccx5jq
      type: object
      x-internal: true
      required:
        - filename
        - byte_size
        - checksum
        - content_type
      properties:
        filename:
          type: string
          x-stoplight:
            id: npiq1r1p6z5sz
        byte_size:
          type: integer
          x-stoplight:
            id: 173ysh5cb9fj9
        checksum:
          type: string
          x-stoplight:
            id: u1cilwg6olbvu
        content_type:
          type: string
          x-stoplight:
            id: 2bz7ycohbo4zz
        metadata:
          type: object
          x-stoplight:
            id: 7zg8sn25q1paq
      additionalProperties: false
    DirectUpload-Read:
      title: DirectUpload-Read
      x-stoplight:
        id: ge5fs3tk8yb8k
      type: object
      required:
        - id
        - byte_size
        - checksum
        - content_type
        - created_at
        - filename
        - key
        - service_name
        - signed_id
        - direct_upload
      properties:
        id:
          type: string
          x-stoplight:
            id: lzwkhbbuc30lt
          format: uuid
        byte_size:
          type: integer
          x-stoplight:
            id: zdq5i2km7dbdd
        checksum:
          type: string
          x-stoplight:
            id: pfgyb7ctywy3o
        content_type:
          type: string
          x-stoplight:
            id: id6fbesbolbxu
        created_at:
          type: string
          x-stoplight:
            id: qkkile7jxkghk
          format: date-time
        filename:
          type: string
          x-stoplight:
            id: nh2lxjat0biia
        key:
          type: string
          x-stoplight:
            id: saakohyy5kvvz
        metadata:
          type: object
          x-stoplight:
            id: zlk0ufjqtjaxq
        service_name:
          type: string
          x-stoplight:
            id: br0ew9wo8145q
        signed_id:
          type: string
          x-stoplight:
            id: zvuflukjwdj16
        direct_upload:
          type: object
          x-stoplight:
            id: e4cw0bh9x1t4n
          required:
            - url
          properties:
            url:
              type: string
              x-stoplight:
                id: l0qwu7ya2mng0
              format: uri
            headers:
              type: object
              x-stoplight:
                id: jgxk00g0qfrub
      additionalProperties: false
    UnauthenticatedError-Response:
      title: UnauthenticatedError-Response
      x-stoplight:
        id: o477eph7ttbzt
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/UnauthenticatedError'
      additionalProperties: false
    Error-Response:
      title: Error-Response
      x-stoplight:
        id: 52cydhphee3qe
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/Error'
      additionalProperties: false
    ModelError-Response:
      title: ModelError-Response
      x-stoplight:
        id: payf9ndh3l6np
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/ModelError'
      additionalProperties: false
    UnauthenticatedError:
      title: UnauthenticatedError
      x-stoplight:
        id: 202o69l0fs40h
      allOf:
        - $ref: '#/components/schemas/Error'
        - type: object
          x-stoplight:
            id: tg10dt7s0l6bw
          properties:
            error_type:
              type: string
              x-stoplight:
                id: wvq8c0qsym4hz
          required:
            - error_type
    Error:
      title: Error
      x-stoplight:
        id: 3g57kkik3l464
      type: object
      description: An Error.
      required:
        - code
      properties:
        code:
          type: string
          x-stoplight:
            id: 7o9x1t8v0bgfo
      additionalProperties: false
    ModelError:
      title: ModelError
      x-stoplight:
        id: nhp6714o4j1qt
      description: A Model-specific error
      allOf:
        - $ref: '#/components/schemas/Error'
        - type: object
          required:
            - errors
          properties:
            errors:
              type: array
              x-stoplight:
                id: m4ul9vcq2deh6
              items:
                $ref: '#/components/schemas/ModelError-Item'
    ModelError-Item:
      title: ModelError-Item
      x-stoplight:
        id: b93chwval2t8d
      type: object
      required:
        - model
        - field
        - message
      properties:
        model:
          type: string
          x-stoplight:
            id: 30myfyjkno8ao
          description: The Model associated with this Error
        field:
          type: string
          x-stoplight:
            id: 8gl4ed3uxhdws
          description: The field associated with this Error
        message:
          type: string
          x-stoplight:
            id: bmgbrtmw17qsj
          description: The Error message
      additionalProperties: false
  responses:
    UnauthenticatedError:
      description: Example response
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/UnauthenticatedError-Response'
            type: object
    Error:
      description: Error response
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error-Response'
            type: object
    ModelError:
      description: ''
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ModelError-Response'
            type: object
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````