Recent searches


No recent searches

Some uploads fail randomly using Help Center Attachments API



Posted Jan 28, 2025

Hi Everyone, 

I'm using Zendesk Help Center Attachments API to add attachments to an article. However, some uploads fail randomly with 500 error (Internal Server Error for API: ). The failures vary each time I attempt, both in the specific attachments and the number that fail. Re-publishing succeeds for previously failed attachments but causes others to fail. I've added retry of failed API calls which gives 500 error & for them I get success.  When I compared the Request header of failed api call and the one send using replay XHR featue of network call in devtools, they were same for failed & success calls. Even the binary data send is same on comparison. 

My guesses are its due to  Temporary Server Overload issue / Race Conditions / Concurrency Limitations , but couldn't find any supporting documents if this is the real root cause , can anyone please guide me into right direction ? 

I'm trying to upload attachments while uploading content to zendesk Help Centre API, which are 10  parallel api calls, meaning, I make 10 api callso to below curl and wait for there response and then make further 10 api calls, untill all the content is uploaded. I've also tried reducing to 3 parallel API calls, same error is reproduced over there as well. For faster uploading the content, I want to support parallel API calls


Curl: 

curl --location 'https://adobe7546.zendesk.com/api/v2/help_center/articles/24164966574354/attachments.json' \
--header 'authority: adobe7546.zendesk.com' \
--header 'accept: application/json, text/plain, */*' \
--header 'authorization: Basic <token>' \
--header 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 14_6_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Electron/12.2.3 Safari/537.36' \
--header 'sec-fetch-site: cross-site' \
--header 'sec-fetch-mode: cors' \
--header 'sec-fetch-dest: empty' \
--header 'accept-language: en-US' \
--header 'cookie: <cookies>' \
--form 'inline="true"' \
--form 'file=<binary_file_data_sent_as_blob>'

API URL: 

https://adobe7546.zendesk.com/api/v2/help_center/articles/23838113722642/attachments.json

Our Code, we are calling makeAttachmentApiCall() function:

import fs from 'fs'
import axios, { Method } from 'axios'
import * as  _  from 'lodash'
function uploadAttachment(api_url,bodyFormData,noOfRetries=10){
  return axios.post(api_url, bodyFormData, {
                  headers: { 
           "Content-Type": "multipart/form-data",
            ...this.defaultUrlparams.headers 
      },
                 auth: {
                           username: this.user,
                           password: this.password
       }
     })
             .then((result) => {
          console.log(result)
      })
    .catch((err) => {
         console.log(err);
         if(err && noOfRetries<=10){
             return _.delay(() => {
                uploadAttachment(api_url,bodyFormData,file, ++noOfRetries)
                    .then(result=>result).catch(error=>error)
                   }, noOfRetries * 1000)
          }
         if(err) {
             console.error("failed to upload file " + file + "," + err)
         } 
        return error
             });
}
async function makeAttachmentApiCall(){
const bodyFormData = new FormData()
  bodyFormData.append('inline', isInline)
  const buffer = fs.readFileSync(file);
  const blob = new Blob([buffer], { type: mime.getMimeType(file) });
  bodyFormData.append('file', blob, path.basename(file))
  await uploadAttachment(api_url,bodyFormData)
}
where api_url looks like = https://adobe7546.zendesk.com/api/v2/help_center/articles/24175204782354/attachments.json
where file is of type string with absolute file_path like “/Users/divyac/Documents/My RoboHelp Projects/outputs/About RoboHelp/Zendesk/assets/images/BadgeTip.png”

Response: 

 {"body":"{"status":500,"error":"Internal Server Error"}"

0

1

1 comment

image avatar

Erica Girges

Zendesk Developer Advocacy

Hi Divya, 
 
I recommend trying to create your attachments as unassociated attachments first. Then you can use the Associate Attachments to Article in Bulk endpoint associate them with the desired article. This endpoint is capable of associating up to 20 attachments at once. This would help prevent any race conditions. 

0


Please sign in to leave a comment.

Didn't find what you're looking for?

New post