# Get upload url upload url `POST` `/api/v1/assets/upload-url` Returns a pre-signed S3 URL and an upload token. PUT the file bytes directly to the URL, then call complete_asset_upload with the token to create the data source. Example upload step: curl -X PUT "" --upload-file "/path/to/file.csv" For Excel files, pass sheet_index (0-based) to select which sheet to convert to CSV. ## Request body `application/json` | Field | Type | Required | Description | |-------|------|----------|-------------| | file_name | string | yes | File name including extension (e.g. 'accounts.csv' or 'data.xlsx') | | sheet_index | integer | no | Sheet index (0-based) to convert for Excel files | ## Response `200 OK` — `application/json` | Field | Type | Description | |-------|------|-------------| | upload_url | string | Pre-signed S3 URL — PUT the file bytes directly to this URL | | upload_token | string | Opaque token to pass to complete_upload after the PUT succeeds | | expires_in | integer | Seconds until the upload URL and token expire | ## Errors | Status | Description | |--------|-------------| | 400 | Bad Request | | 422 | Unprocessable Entity |