slackapi / slackapi/python-slack-sdk

files_upload_v2 returns internal_error when using markdown in blocks

Open
#1,756 8 comments 4 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

area:async auto-triage-skip bug server-side-issue web-client
Dominant language
Python
Stars
4k
Forks
857
Avg merge
22h 21m
Merged PRs (30d)
16

Description

files_upload_v2 returns internal_error when using markdown in blocks parameter

Reproducible in:
slack-bolt==1.25.0
slack-sdk==3.36.0
Python 3.13.5
ProductName: macOS
ProductVersion: 15.5
BuildVersion: 24F74
Darwin Kernel Version 24.5.0
The Slack SDK version
slack-bolt==1.25.0
slack-sdk==3.36.0
Python runtime version
Python 3.13.5
OS info
ProductName:		macOS
ProductVersion:		15.5
BuildVersion:		24F74
Darwin Kernel Version 24.5.0: Tue Apr 22 19:53:27 PDT 2025; root:xnu-11417.121.6~2/RELEASE_ARM64_T6041

Steps to reproduce:

1. Code Example
from slack_sdk.web.async_client import AsyncWebClient
import json

# Initialize client
client = AsyncWebClient(token="xoxb-your-token")

# Prepare parameters
channel_id = "D099T7G7VHD"  # DM channel
blocks = [{"type": "markdown", "text": "_**Haim Raitsev** posted a new message_\\n> test"}]
files = [{"id": "F09J0L8TDRQ", "title": "screenshot.png"}]

# Attempt to upload with blocks
response = await client.files_upload_v2(
    channel=channel_id,
    file_uploads=[
        {
            "content": b"<file_bytes_here>",
            "filename": "screenshot.png",
            "title": "screenshot.png"
        }
    ],
    blocks=json.dumps(blocks)
)
2. Response
{
    "ok": False,
    "error": "internal_error"
}

Expected result:

The file should be uploaded successfully with the rich text blocks displayed in the message, as the underlying files.completeUploadExternal:

Actual result:

The API returns {"ok": false, "error": "internal_error"} without any additional error details.


Additional Context:

This issue is reproduced only when we have a new markdown block (https://docs.slack.dev/reference/block-kit/blocks/markdown-block/) when we use other blocks the message posted correctly.

files.completeUploadExternal API Call

HTTP Request
POST https://slack.com/api/files.completeUploadExternal HTTP/1.1
Host: slack.com
Authorization: Bearer xoxb-your-token-here
Content-Type: application/x-www-form-urlencoded
Request Details

Method: POST

URL: https://slack.com/api/files.completeUploadExternal

Headers:

Authorization: Bearer xoxb-your-token-here
Content-Type: application/x-www-form-urlencoded

Body (URL-encoded):

files=[{"id":"F09J0L8TDRQ","title":"screenshot.png"}]
channel_id=D099T7G7VHD
blocks=[{"type":"markdown","text":"_**Haim Raitsev** posted a new message_\\n> test"}]
Body Parameters Breakdown
Parameter Value Description
files [{"id":"F09J0L8TDRQ","title":"screenshot.png"}] JSON array of file objects (URL-encoded)
channel_id D099T7G7VHD DM channel ID where file will be shared
blocks [{"type":"markdown","text":"_**Haim Raitsev** posted a new message_\\n> test"}] JSON array of blocks (URL-encoded)

Example using cURL

curl -X POST https://slack.com/api/files.completeUploadExternal \
  -H "Authorization: Bearer xoxb-your-token-here" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode 'files=[{"id":"F09J0L8TDRQ","title":"screenshot.png"}]' \
  --data-urlencode 'channel_id=D099T7G7VHD' \
  --data-urlencode 'blocks=[{"type":"markdown","text":"_**Haim Raitsev** posted a new message_\\n> test"}]'
Error Response (Current Issue)
{
    "ok": false,
    "error": "internal_error"
}

Thank you for maintaining this excellent SDK!

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at AsyncWebClient.files_upload_v2 and trace the request sent to files.completeUploadExternal, comparing the markdown block case with blocks that succeed. Reproduce the request from the issue and determine whether the SDK payload or the Slack API is responsible. Done means the cause is isolated and the issue has a verified fix or a documented upstream limitation.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api, backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.