You can upload a file and attach it to a ticket comment. The attachment appears as a link in the ticket comment in the agent interface in Zendesk. If ticket notifications are enabled, the attachment appears as a link in the notification email.

Use the Attachments API to upload a file you want to attach. However, you can only attach the uploaded file to a ticket comment with theTickets APIwhen adding the comment to a ticket you're creating or updating.

For details and examples, seeAdding ticket attachments with the API.

This API is for tickets attachments. To attach files to articles in your help center, seeArticle Attachmentsin the Help Center API documentation.

JSON format

Attachments are represented as JSON objects with the following properties:

Name Type Read-only Mandatory Description
content_type string true false The content type of the image. Example value: "image/png"
content_url string true false A full URL where the attachment image file can be downloaded. The file may be hosted externally so take care not to inadvertently send Zendesk authentication credentials. SeeWorking with url properties
deleted boolean true false If true, the attachment has been deleted
file_name string true false The name of the image file
height string true false The height of the image file in pixels. If height is unknown, returns null
id integer true false Automatically assigned when created
inline boolean true false If true, the attachment is excluded from the attachment list and the attachment's URL can be referenced within the comment of a ticket. Default is false
malware_access_override boolean true false If true, you can download an attachment flagged as malware. If false, you can't download such an attachment.
malware_scan_result string true false The result of the malware scan. There is a delay between the time the attachment is uploaded and when the malware scan is completed. Usually the scan is done within a few seconds, but high load conditions can delay the scan results. Possible values: "malware_found", "malware_not_found", "failed_to_scan", "not_scanned"
mapped_content_url string true false The URL the attachment image file has been mapped to
size integer true false The size of the image file in bytes
thumbnails array true false An array of attachment objects. Note that photo thumbnails do not have thumbnails
url string true false A URL to access the attachment details
width string true false The width of the image file in pixels. If width is unknown, returns null

A file represented as anAttachmentobject

Example

             
{"content_type":"image/png","content_url":"https://company.zendesk.com/attachments/my_funny_profile_pic.png","file_name":"my_funny_profile_pic.png","id":928374,"size":166144,"thumbnails":[{"content_type":"image/png","content_url":"https://company.zendesk.com/attachments/my_funny_profile_pic_thumb.png","file_name":"my_funny_profile_pic_thumb.png","id":928375,"size":58298}]}

上传文件

  • POST /api/v2/uploads

Uploads a file that can be attached to a ticket comment. It doesn't attach the file to the comment. For details and examples, seeAttaching ticket comments with the API.

The endpoint has a requiredfilenamequery parameter. The parameter specifies what the file will be named when attached to the ticket comment (to give the agent more context about the file). The parameter does not specify the file on the local system to be uploaded. While the two names can be different, their file extensions must be the same. If they don't match, the agent's browser or file reader could give an error when attempting to open the attachment.

TheContent-Typeheader must contain a recognized MIME type that correctly describes the type of the uploaded file. Failing to send a recognized, correct type may cause undesired behavior. For example, in-browser audio playback may be interrupted by the browser's security mechanisms for MP3s uploaded with an incorrect type.

Adding multiple files to the same upload is handled by splitting requests and passing the API token received from the first request to each subsequent request. The token is valid for 3 days.

Note: Even ifprivate attachmentsare enabled in the Zendesk Support instance, uploaded files are visible to any authenticated user at thecontent_URLspecified in theJSON responseuntil the upload token is consumed. Once a file is associated with a ticket or post, visibility is restricted to users with access to the ticket or post with the attachment.

Allowed For

  • End users

Code Samples

curl
              
curl"https://{subdomain}.zendesk.com/api/v2/uploads?filename=user_crash.log&token={optional_token}"\--data-binary @crash.log\-H"Content-Type: text/plain"\-v -u{email_address}:{password}\-X POST
Go
              
import("fmt""io""net/http")funcmain(){url:="https://example.zendesk.com/api/v2/uploads"method:="POST"req,err:=http.NewRequest(method,url,nil)iferr!=nil{fmt.Println(err)return}req.Header.Add("Content-Type","application/json")req.Header.Add("Authorization","Basic ")// Base64 encoded "username:password"client:=&http.Client{}res,err:=client.Do(req)iferr!=nil{fmt.Println(err)return}deferres.Body.Close()body,err:=io.ReadAll(res.Body)iferr!=nil{fmt.Println(err)return}fmt.Println(string(body))}
Java
              
importcom.squareup.okhttp.*;OkHttpClientclient=newOkHttpClient();HttpUrl.BuilderurlBuilder=HttpUrl.parse("https://example.zendesk.com/api/v2/uploads").newBuilder();RequestBodybody=RequestBody.create(MediaType.parse("application/json"),"""""");Requestrequest=newRequest.Builder().url(urlBuilder.build()).method("POST",body).addHeader("Content-Type","application/json").addHeader("Authorization",Credentials.basic("your-email","your-password")).build();Responseresponse=client.newCall(request).execute();
Nodejs
              
varaxios=require('axios');varconfig={method:'POST',url:'https://example.zendesk.com/api/v2/uploads',headers:{'Content-Type':'application/json','Authorization':'Basic ',// Base64 encoded "username:password"},};axios(config).then(function(response){console.log(JSON.stringify(response.data));}).catch(function(error){console.log(error);});
Python
              
importrequestsurl="https://example.zendesk.com/api/v2/uploads"headers={"Content-Type":"application/json",}response=requests.request("POST",url,auth=('',''),headers=headers)print(response.text)
Ruby
              
require"net/http"uri=URI("https://example.zendesk.com/api/v2/uploads")request=Net::HTTP::Post.new(uri,"Content-Type":"application/json")request.basic_auth"username","password"response=Net::HTTP.start uri.hostname,uri.port,use_ssl:truedo|http|http.request(request)end

Example response(s)

201 Created
              
// Status 201 Created{"upload":{"attachment":{"content_type":"image/png","content_url":"https://company.zendesk.com/attachments/token/tyBq1ms40dFaHefSIigxZpwGg/?name=crash.png","deleted":false,"file_name":"crash.png","height":"62","id":1503729607981,"inline":false,"mapped_content_url":"https://company.zendesk.com/attachments/token/tyBq1ms40dFaHefSIigxZpwGg/?name=crash.png","size":5172,"thumbnails":[],"url":"https://company.zendesk.com/api/v2/attachments/1503729607981.json","width":"80"},"attachments":[{"content_type":"image/png","content_url":"https://company.zendesk.com/attachments/token/tyBq1ms40dFaHefSIigxZpwGg/?name=crash.png","deleted":false,"file_name":"crash.png","height":"62","id":1503729607981,"inline":false,"mapped_content_url":"https://company.zendesk.com/attachments/token/tyBq1ms40dFaHefSIigxZpwGg/?name=crash.png","size":5172,"thumbnails":[],"url":"https://company.zendesk.com/api/v2/attachments/1503729607981.json","width":"80"}],"token":"LXJdriewLBP8JrtzzkN7Ne4k6"}}

删除Upload

  • DELETE /api/v2/uploads/{token}

Allowed for

  • End Users

Parameters

Name Type In Required Description
token string Path true The token of the uploaded attachment

Code Samples

curl
              
curlhttps://{subdomain}.zendesk.com/api/v2/uploads/{token}\-v -u{email_address}:{password}-X DELETE
Go
              
import("fmt""io""net/http")funcmain(){url:="https://example.zendesk.com/api/v2/uploads/6bk3gql82em5nmf"method:="DELETE"req,err:=http.NewRequest(method,url,nil)iferr!=nil{fmt.Println(err)return}req.Header.Add("Content-Type","application/json")req.Header.Add("Authorization","Basic ")// Base64 encoded "username:password"client:=&http.Client{}res,err:=client.Do(req)iferr!=nil{fmt.Println(err)return}deferres.Body.Close()body,err:=io.ReadAll(res.Body)iferr!=nil{fmt.Println(err)return}fmt.Println(string(body))}
Java
              
importcom.squareup.okhttp.*;OkHttpClientclient=newOkHttpClient();HttpUrl.BuilderurlBuilder=HttpUrl.parse("https://example.zendesk.com/api/v2/uploads/6bk3gql82em5nmf").newBuilder();Requestrequest=newRequest.Builder().url(urlBuilder.build()).method("DELETE",null).addHeader("Content-Type","application/json").addHeader("Authorization",Credentials.basic("your-email","your-password")).build();Responseresponse=client.newCall(request).execute();
Nodejs
              
varaxios=require('axios');varconfig={method:'DELETE',url:'https://example.zendesk.com/api/v2/uploads/6bk3gql82em5nmf',headers:{'Content-Type':'application/json','Authorization':'Basic ',// Base64 encoded "username:password"},};axios(config).then(function(response){console.log(JSON.stringify(response.data));}).catch(function(error){console.log(error);});
Python
              
importrequestsurl="https://example.zendesk.com/api/v2/uploads/6bk3gql82em5nmf"headers={"Content-Type":"application/json",}response=requests.request("DELETE",url,auth=('',''),headers=headers)print(response.text)
Ruby
              
require"net/http"uri=URI("https://example.zendesk.com/api/v2/uploads/6bk3gql82em5nmf")request=Net::HTTP::删除.new(uri,"Content-Type":"application/json")request.basic_auth"username","password"response=Net::HTTP.start uri.hostname,uri.port,use_ssl:truedo|http|http.request(request)end

Example response(s)

204 No Content
              
// Status 204 No Contentnull

Show Attachment

  • GET / api / v2 /附件/ {attachment_id}

Shows attachment details. You can get the value of theattachment_idparameter by listing the ticket's comments. SeeList Comments. Each comment in the list has anattachmentslist that specifies anidfor each attachment.

Allowed for

  • Agents

Parameters

Name Type In Required Description
attachment_id integer Path true The ID of the attachment

Code Samples

curl
              
curlhttps://{subdomain}.zendesk.com/api/v2/attachments/{attachment_id}\-v -u{email_address}:{password}
Go
              
import("fmt""io""net/http")funcmain(){url:="https://example.zendesk.com/api/v2/attachments/498483"method:="GET"req,err:=http.NewRequest(method,url,nil)iferr!=nil{fmt.Println(err)return}req.Header.Add("Content-Type","application/json")req.Header.Add("Authorization","Basic ")// Base64 encoded "username:password"client:=&http.Client{}res,err:=client.Do(req)iferr!=nil{fmt.Println(err)return}deferres.Body.Close()body,err:=io.ReadAll(res.Body)iferr!=nil{fmt.Println(err)return}fmt.Println(string(body))}
Java
              
importcom.squareup.okhttp.*;OkHttpClientclient=newOkHttpClient();HttpUrl.BuilderurlBuilder=HttpUrl.parse("https://example.zendesk.com/api/v2/attachments/498483").newBuilder();Requestrequest=newRequest.Builder().url(urlBuilder.build()).method("GET",null).addHeader("Content-Type","application/json").addHeader("Authorization",Credentials.basic("your-email","your-password")).build();Responseresponse=client.newCall(request).execute();
Nodejs
              
varaxios=require('axios');varconfig={method:'GET',url:'https://example.zendesk.com/api/v2/attachments/498483',headers:{'Content-Type':'application/json','Authorization':'Basic ',// Base64 encoded "username:password"},};axios(config).then(function(response){console.log(JSON.stringify(response.data));}).catch(function(error){console.log(error);});
Python
              
importrequestsurl="https://example.zendesk.com/api/v2/attachments/498483"headers={"Content-Type":"application/json",}response=requests.request("GET",url,auth=('',''),headers=headers)print(response.text)
Ruby
              
require"net/http"uri=URI("https://example.zendesk.com/api/v2/attachments/498483")request=Net::HTTP::Get.new(uri,"Content-Type":"application/json")request.basic_auth"username","password"response=Net::HTTP.start uri.hostname,uri.port,use_ssl:truedo|http|http.request(request)end

Example response(s)

200 OK
              
// Status 200 OK{"attachment":{"content_type":"application/binary","content_url":"https://company.zendesk.com/attachments/myfile.dat","file_name":"myfile.dat","id":498483,"size":2532,"thumbnails":[],"url":"https://company.zendesk.com/api/v2/attachments/498483.json"}}

Update Attachment for Malware

  • PUT /api/v2/attachments/{attachment_id}

Toggles enabling or restricting agent access to attachments with detected malware.

Allowed For

  • Admins

Parameters

Name Type In Required Description
attachment_id integer Path true The ID of the attachment

Example body

             
{"attachment":{"malware_access_override":true}}

Code Samples

curl
              
curlhttps://{subdomain}.zendesk.com/api/v2/attachments/{attachment_id}.json\-H"Content-Type: application/json"-d'{"attachment": {"malware_access_override": true}}'\-v -u{email_address}:{password}-X PUT
Go
              
import("fmt""io""net/http""strings")funcmain(){url:="https://example.zendesk.com/api/v2/attachments/498483"method:="PUT"payload:=strings.NewReader(`{"attachment": {"malware_access_override": true}}`)req,err:=http.NewRequest(method,url,payload)iferr!=nil{fmt.Println(err)return}req.Header.Add("Content-Type","application/json")req.Header.Add("Authorization","Basic ")// Base64 encoded "username:password"client:=&http.Client{}res,err:=client.Do(req)iferr!=nil{fmt.Println(err)return}deferres.Body.Close()body,err:=io.ReadAll(res.Body)iferr!=nil{fmt.Println(err)return}fmt.Println(string(body))}
Java
              
importcom.squareup.okhttp.*;OkHttpClientclient=newOkHttpClient();HttpUrl.BuilderurlBuilder=HttpUrl.parse("https://example.zendesk.com/api/v2/attachments/498483").newBuilder();RequestBodybody=RequestBody.create(MediaType.parse("application/json"),"""{\"attachment\":{\"malware_access_override\":true}}""");Requestrequest=newRequest.Builder().url(urlBuilder.build()).method("PUT",body).addHeader("Content-Type","application/json").addHeader("Authorization",Credentials.basic("your-email","your-password")).build();Responseresponse=client.newCall(request).execute();
Nodejs
              
varaxios=require('axios');vardata=JSON.stringify({"attachment":{"malware_access_override":true}});varconfig={method:'PUT',url:'https://example.zendesk.com/api/v2/attachments/498483',headers:{'Content-Type':'application/json','Authorization':'Basic ',// Base64 encoded "username:password"},data:data,};axios(config).then(function(response){console.log(JSON.stringify(response.data));}).catch(function(error){console.log(error);});
Python
              
importrequestsimportjsonurl="https://example.zendesk.com/api/v2/attachments/498483"payload=json.loads("""{"attachment": {"malware_access_override": true}}""")headers={"Content-Type":"application/json",}response=requests.request("PUT",url,auth=('',''),headers=headers,json=payload)print(response.text)
Ruby
              
require"net/http"uri=URI("https://example.zendesk.com/api/v2/attachments/498483")request=Net::HTTP::Put.new(uri,"Content-Type":"application/json")request.body=%q({"attachment":{"malware_access_override":true}})request.basic_auth"username","password"response=Net::HTTP.start uri.hostname,uri.port,use_ssl:truedo|http|http.request(request)end

Example response(s)

200 OK
              
// Status 200 OK{"attachment":{"content_type":"application/binary","content_url":"https://company.zendesk.com/attachments/myfile.dat","file_name":"myfile.dat","id":498483,"size":2532,"thumbnails":[],"url":"https://company.zendesk.com/api/v2/attachments/498483.json"}}

Redact Comment Attachment

  • 把/ api / v2 /票/ {ticket_id} /评论/ {comment_id}/attachments/{attachment_id}/redact

Redaction allows you to permanently remove attachments from an existing comment on a ticket. Once removed from a comment, the attachment is replaced with an empty "redacted.txt" file.

The redaction is permanent. It is not possible to undo redaction or see what was removed. Once a ticket is closed, redacting its attachments is no longer possible.

Also, if you want to redact an inline attachment, you can use theinclude_inline_imagesparameter in theList Commentsoperation to obtain the inline attachment ID, and use it in the request URL.

Allowed For

Parameters

Name Type In Required Description
attachment_id integer Path true The ID of the attachment
comment_id integer Path true The ID of the comment
ticket_id integer Path true The ID of the ticket

Code Samples

curl
              
curlhttps://{subdomain}.zendesk.com/api/v2/tickets/{ticket_id}/comments/{comment_id}/attachments/{attachment_id}/redact\-H"Content-Type: application/json"-v -u{email_address}:{password}-X PUT -d'{}'
Go
              
import("fmt""io""net/http")funcmain(){url:=“https://example.亚博zendesk.com/api/v2/tickets/123456/comments/654321/attachments/498483/redact"method:="PUT"req,err:=http.NewRequest(method,url,nil)iferr!=nil{fmt.Println(err)return}req.Header.Add("Content-Type","application/json")req.Header.Add("Authorization","Basic ")// Base64 encoded "username:password"client:=&http.Client{}res,err:=client.Do(req)iferr!=nil{fmt.Println(err)return}deferres.Body.Close()body,err:=io.ReadAll(res.Body)iferr!=nil{fmt.Println(err)return}fmt.Println(string(body))}
Java
              
importcom.squareup.okhttp.*;OkHttpClientclient=newOkHttpClient();HttpUrl.BuilderurlBuilder=HttpUrl.parse(“https://example.亚博zendesk.com/api/v2/tickets/123456/comments/654321/attachments/498483/redact").newBuilder();RequestBodybody=RequestBody.create(MediaType.parse("application/json"),"""""");Requestrequest=newRequest.Builder().url(urlBuilder.build()).method("PUT",body).addHeader("Content-Type","application/json").addHeader("Authorization",Credentials.basic("your-email","your-password")).build();Responseresponse=client.newCall(request).execute();
Nodejs
              
varaxios=require('axios');varconfig={method:'PUT',url:'https://example.zendesk.com/api/v2/tickets/123456/comments/654321/attachments/498483/redact',headers:{'Content-Type':'application/json','Authorization':'Basic ',// Base64 encoded "username:password"},};axios(config).then(function(response){console.log(JSON.stringify(response.data));}).catch(function(error){console.log(error);});
Python
              
importrequestsurl=“https://example.亚博zendesk.com/api/v2/tickets/123456/comments/654321/attachments/498483/redact"headers={"Content-Type":"application/json",}response=requests.request("PUT",url,auth=('',''),headers=headers)print(response.text)
Ruby
              
require"net/http"uri=URI(“https://example.亚博zendesk.com/api/v2/tickets/123456/comments/654321/attachments/498483/redact")request=Net::HTTP::Put.new(uri,"Content-Type":"application/json")request.basic_auth"username","password"response=Net::HTTP.start uri.hostname,uri.port,use_ssl:truedo|http|http.request(request)end

Example response(s)

200 OK
              
// Status 200 OK{"attachment":{"content_type":"application/binary","content_url":"https://company.zendesk.com/attachments/myfile.dat","file_name":"myfile.dat","id":498483,"size":2532,"thumbnails":[],"url":"https://company.zendesk.com/api/v2/attachments/498483.json"}}