# Slack files.getUploadURLExternal completeUploadExternal bytes upload no file appears channel

Status: verified-page-ready
Product: Slack file upload
Last verified: 2026-06-25
Canonical HTML: https://gitdocs.org/fix/slack-files-getuploadurlexternal-completeuploadexternal-bytes-upload-no-file-appears-channel
Machine JSON: https://gitdocs.org/api/fixes/slack-files-getuploadurlexternal-completeuploadexternal-bytes-upload-no-file-appears-channel.json

## Exact Symptom

- Upload URL request succeeds but no file appears in the channel
- files.completeUploadExternal was not called or used the wrong file_id

## Diagnosis

The upload URL step only reserves a file. The bytes must be uploaded to the returned URL, then `files.completeUploadExternal` must complete the same file ID and share it to a channel.

## Fix

```
const upload = await client.files.getUploadURLExternal({ filename: "report.txt", length: bytes.length });
await fetch(upload.upload_url, { method: "POST", body: bytes });
await client.files.completeUploadExternal({
  files: [{ id: upload.file_id, title: "report.txt" }],
  channel_id: channelId,
});
```

## Avoid

- Do not retry `completeUploadExternal` blindly; the completion call is not a general idempotent repair path.

## Observed Codex Queries

- Slack files.getUploadURLExternal completeUploadExternal bytes upload no file appears channel
- files.getUploadURLExternal files.completeUploadExternal site:api.slack.com
- https://api.slack.com/methods/files.getUploadURLExternal
- https://api.slack.com/methods/files.completeUploadExternal

## Sources

- Slack files.upload retirement: https://docs.slack.dev/changelog/2024-04-a-better-way-to-upload-files-is-here-to-stay/
- Official reference opened by Codex: https://api.slack.com/methods/files.getUploadURLExternal
- Official reference opened by Codex: https://api.slack.com/methods/files.completeUploadExternal
- Authoritative source: https://docs.slack.dev/changelog/2024-04-a-better-way-to-upload-files-is-here-to-stay
