Legacy Dev Forum Posts

 View Only

Sign Up

400 Bad Request from apps.mypurecloud.com/uploads/v2/contactlist

  • 1.  400 Bad Request from apps.mypurecloud.com/uploads/v2/contactlist

    Posted 06-05-2025 18:12

    Nathan_Suiter | 2017-10-12 20:25:31 UTC | #1

    I am getting a 400 Bad Request response when calling the uploads API to load a csv file into a contact list. This is the call I'm making to the API (Bearer token obfuscated):

    POST https://apps.mypurecloud.com/uploads/v2/contactlist HTTP/1.1 Authorization: Bearer aaaaabbbbbbccccccddddddeeeeeefffff Content-Type: application/x-www-form-urlencoded Host: apps.mypurecloud.com Content-Length: 1280 Expect: 100-continue

    id=501f7cfd-f46c-4423-bcdc-84344dabca41&fileType=contactlist&contact-id-name=ActorID&file=Rmlyc3ROYW1lLExhc3ROYW1lLFByaW1hcnlQaG9uZU51bWJlcixTZWNvbmRhcnlQaG9uZU51bWJlcixUaW1lWm9uZSxUaW1lUHJlZmVyZW5jZSxHcm91cE5hbWUsTmlja05hbWUsQWN0b3JJRCxET0IsQWRkcmVzczEsQWRkcmVzczIsQWRkcmVzczMsQ2l0eSxTdGF0ZSxQb3N0YWxDb2RlLEdlbmRlcixBY3Rpb25Db2RlLER1ZURhdGUsQ0FNUEFJR04NCkNhcnJpZSxHb2xkZW4sMzA0NTQ5MjM2OSwzMDQzNDQ1ODAxLFVUQywyMTowMCAtIDAwOjAwLERvbGxhciBHZW5lcmFsLCw2NDUxMzY5LDE5NjAtMTItMjEsMTkwIExhY3kgSG9sbG93IFJvYWQsLCxDaGFybGVzdG9uLFdWLDI1MzExLEYsQy1BRFYgICAsMjAxNy0wOS0xOCAxMzozNjowMCxER19DYWxsXzFfMl8yMDE3MTAxMQ0KQ3ludGhpYSxXZWJiLDI3MDQzNjIyOTQsLFVUQywyMjowMCAtIDAxOjAwLERvbGxhciBHZW5lcmFsLCw2NjA0MzAzLDE5NjItMDctMTAsMTMxIFlhcmJvcm91Z2ggRHIsLCxNdXJyYXksS1ksNDIwNzEsRixDLUFEViAgICwyMDE3LTEwLTA5IDEzOjM2OjAwLERHX0NhbGxfMV8yXzIwMTcxMDExDQpMb3JhLEdpYnNvbiw0Nzg4MzYzNTEwLDQ3ODgzNjM1MTAsVVRDLDE0OjAwIC0gMDI6MDAsRG9sbGFyIEdlbmVyYWwsLDU4Nzk5MzQsMTk2MC0xMi0xMixQbyBCb3ggNTc0LCwsUm9iZXJ0YSxHQSwzMTA3OCxGLEMtQURWICAgLDIwMTctMDktMzAgMTM6MzY6MDAsREdfQ2FsbF8xXzJfMjAxNzEwMTENClJ1c3NlbCxLcmFma2EsNDAyNDQwNDczNCwsVVRDLDE2OjAwIC0gMTk6MDAsRG9sbGFyIEdlbmVyYWwsLDgwNzYyMTUsMTk4Ny0wMS0zMSw0MDIgTiAxNFRoIFN0cmVldCwsLEFzaGxhbmQsTkUsNjgwMDMsTSxDLUFEViAgICwyMDE3LTA5LTE3IDEzOjM2OjAwLERHX0NhbGxfMV8yXzIwMTcxMDExDQo%3D

    The response I'm getting is this:

    HTTP/1.1 400 Bad Request Server: nginx/1.10.3 Date: Thu, 12 Oct 2017 20:12:09 GMT Content-Length: 0 Connection: keep-alive Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization Access-Control-Allow-Methods: POST Access-Control-Allow-Origin: * ININ-Correlation-Id: a09cc90f-bcaf-4bba-bd71-c8181f073e62

    This is the C# code I'm using:

    var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    string fullUri = "https://api." + host + "/api/v2/outbound/contactlists?name=" + listName; var listResult = await client.GetAsync(fullUri);

    var UserInfo = await listResult.Content.ReadAsStringAsync(); var parsedList = JObject.Parse(UserInfo); string contactListId = (string)parsedList["entities"][0]["id"];

    var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); byte[] file; using (var reader = new BinaryReader(stream)) { file = reader.ReadBytes((int)stream.Length); } var fileBinary = System.Convert.ToBase64String(file);

    var content = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("id", contactListId), new KeyValuePair<string, string>("fileType", "contactlist"), new KeyValuePair<string, string>("contact-id-name", "ActorID"), new KeyValuePair<string, string>("file", fileBinary) });

    var contactList = await client.PostAsync("https://apps." + host + "/uploads/v2/contactlist", content

    I'm hoping someone can help me spot something wrong with the structure of my request - any assistance is appreciated. Thanks!


    Craig.Dahlinger | 2017-10-12 21:05:12 UTC | #2

    Question, in the C# code you are doing a https://api." + host + "/api/v2/outbound, but in the paste you are posting to https://apps.mypurecloud.com/uploads/v2/, can you please verify your host value in your c# code and which url are you posting to that returns the 400.

    Thanks CD


    Nathan_Suiter | 2017-10-12 22:07:41 UTC | #3

    There are 2 api calls in the code. The api/v2/outbound is a get to retrieve the contactListid. That is in turn used in the form content for the uploads/v2/contactList at the bottom of the code snippet. The uploads/v2/contactList is the one throwing the 400. The api/v2/outbound works fine. The host for both is mypurecloud.com


    Craig.Dahlinger | 2017-10-12 22:07:01 UTC | #4

    Content-Type: application/x-www-form-urlencoded, this should be "multipart/form-data; with a boundary value.


    Nathan_Suiter | 2017-10-12 22:08:56 UTC | #5

    Thank you - that gives me something to go on. Started out with the multipart/form-data but had no joy originally (probably missing the boundary value). I will try that and post back with results.


    Craig.Dahlinger | 2017-10-12 22:09:46 UTC | #6

    the boundary value can be anything, for example 'content-type", "multipart/form-data; boundary=----foobar")


    Nathan_Suiter | 2017-10-13 14:41:42 UTC | #7

    Tried this a couple different ways - still getting 400 errors:

    Method 1:

    POST https://apps.mypurecloud.com/uploads/v2/contactlist HTTP/1.1 Authorization: Bearer AAAAAAAAAAAAAABBBBBBBBBBBBBBB Content-Type: multipart/form-data; boundary=------foobar Host: apps.mypurecloud.com Content-Length: 1280 Expect: 100-continue

    id=501f7cfd-f46c-4423-bcdc-84344dabca41&fileType=contactlist&contact-id-name=ActorID&file=Rmlyc3ROYW1lLExhc3ROYW1lLFByaW1hcnlQaG9uZU51bWJlcixTZWNvbmRhcnlQaG9uZU51bWJlcixUaW1lWm9uZSxUaW1lUHJlZmVyZW5jZSxHcm91cE5hbWUsTmlja05hbWUsQWN0b3JJRCxET0IsQWRkcmVzczEsQWRkcmVzczIsQWRkcmVzczMsQ2l0eSxTdGF0ZSxQb3N0YWxDb2RlLEdlbmRlcixBY3Rpb25Db2RlLER1ZURhdGUsQ0FNUEFJR04NCkNhcnJpZSxHb2xkZW4sMzA0NTQ5MjM2OSwzMDQzNDQ1ODAxLFVUQywyMTowMCAtIDAwOjAwLERvbGxhciBHZW5lcmFsLCw2NDUxMzY5LDE5NjAtMTItMjEsMTkwIExhY3kgSG9sbG93IFJvYWQsLCxDaGFybGVzdG9uLFdWLDI1MzExLEYsQy1BRFYgICAsMjAxNy0wOS0xOCAxMzozNjowMCxER19DYWxsXzFfMl8yMDE3MTAxMQ0KQ3ludGhpYSxXZWJiLDI3MDQzNjIyOTQsLFVUQywyMjowMCAtIDAxOjAwLERvbGxhciBHZW5lcmFsLCw2NjA0MzAzLDE5NjItMDctMTAsMTMxIFlhcmJvcm91Z2ggRHIsLCxNdXJyYXksS1ksNDIwNzEsRixDLUFEViAgICwyMDE3LTEwLTA5IDEzOjM2OjAwLERHX0NhbGxfMV8yXzIwMTcxMDExDQpMb3JhLEdpYnNvbiw0Nzg4MzYzNTEwLDQ3ODgzNjM1MTAsVVRDLDE0OjAwIC0gMDI6MDAsRG9sbGFyIEdlbmVyYWwsLDU4Nzk5MzQsMTk2MC0xMi0xMixQbyBCb3ggNTc0LCwsUm9iZXJ0YSxHQSwzMTA3OCxGLEMtQURWICAgLDIwMTctMDktMzAgMTM6MzY6MDAsREdfQ2FsbF8xXzJfMjAxNzEwMTENClJ1c3NlbCxLcmFma2EsNDAyNDQwNDczNCwsVVRDLDE2OjAwIC0gMTk6MDAsRG9sbGFyIEdlbmVyYWwsLDgwNzYyMTUsMTk4Ny0wMS0zMSw0MDIgTiAxNFRoIFN0cmVldCwsLEFzaGxhbmQsTkUsNjgwMDMsTSxDLUFEViAgICwyMDE3LTA5LTE3IDEzOjM2OjAwLERHX0NhbGxfMV8yXzIwMTcxMDExDQo%3D

    Method 1 response:

    HTTP/1.1 400 Bad Request Server: nginx/1.10.3 Date: Fri, 13 Oct 2017 14:38:57 GMT Content-Length: 0 Connection: keep-alive Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization Access-Control-Allow-Methods: POST Access-Control-Allow-Origin: * ININ-Correlation-Id: 88e7d736-e9d1-4c58-927b-92d83ddbca4b

    Method 2:

    POST https://apps.mypurecloud.com/uploads/v2/contactlist HTTP/1.1 Authorization: Bearer AAAAAAAAAAAAAABBBBBBBBBBBBBBB Content-Type: multipart/form-data; boundary=------foobar Host: apps.mypurecloud.com Content-Length: 1809 Expect: 100-continue

    --2e137bbb-bc14-4d3e-b4bf-138af85e43c7 Content-Type: text/plain; charset=utf-8 Content-Disposition: form-data; name=id

    501f7cfd-f46c-4423-bcdc-84344dabca41 --2e137bbb-bc14-4d3e-b4bf-138af85e43c7 Content-Type: text/plain; charset=utf-8 Content-Disposition: form-data; name=fileType

    contactlist --2e137bbb-bc14-4d3e-b4bf-138af85e43c7 Content-Type: text/plain; charset=utf-8 Content-Disposition: form-data; name=contact-id-name

    ActorID --2e137bbb-bc14-4d3e-b4bf-138af85e43c7 Content-Type: text/plain; charset=utf-8 Content-Disposition: form-data; name=file

    Rmlyc3ROYW1lLExhc3ROYW1lLFByaW1hcnlQaG9uZU51bWJlcixTZWNvbmRhcnlQaG9uZU51bWJlcixUaW1lWm9uZSxUaW1lUHJlZmVyZW5jZSxHcm91cE5hbWUsTmlja05hbWUsQWN0b3JJRCxET0IsQWRkcmVzczEsQWRkcmVzczIsQWRkcmVzczMsQ2l0eSxTdGF0ZSxQb3N0YWxDb2RlLEdlbmRlcixBY3Rpb25Db2RlLER1ZURhdGUsQ0FNUEFJR04NCkNhcnJpZSxHb2xkZW4sMzA0NTQ5MjM2OSwzMDQzNDQ1ODAxLFVUQywyMTowMCAtIDAwOjAwLERvbGxhciBHZW5lcmFsLCw2NDUxMzY5LDE5NjAtMTItMjEsMTkwIExhY3kgSG9sbG93IFJvYWQsLCxDaGFybGVzdG9uLFdWLDI1MzExLEYsQy1BRFYgICAsMjAxNy0wOS0xOCAxMzozNjowMCxER19DYWxsXzFfMl8yMDE3MTAxMQ0KQ3ludGhpYSxXZWJiLDI3MDQzNjIyOTQsLFVUQywyMjowMCAtIDAxOjAwLERvbGxhciBHZW5lcmFsLCw2NjA0MzAzLDE5NjItMDctMTAsMTMxIFlhcmJvcm91Z2ggRHIsLCxNdXJyYXksS1ksNDIwNzEsRixDLUFEViAgICwyMDE3LTEwLTA5IDEzOjM2OjAwLERHX0NhbGxfMV8yXzIwMTcxMDExDQpMb3JhLEdpYnNvbiw0Nzg4MzYzNTEwLDQ3ODgzNjM1MTAsVVRDLDE0OjAwIC0gMDI6MDAsRG9sbGFyIEdlbmVyYWwsLDU4Nzk5MzQsMTk2MC0xMi0xMixQbyBCb3ggNTc0LCwsUm9iZXJ0YSxHQSwzMTA3OCxGLEMtQURWICAgLDIwMTctMDktMzAgMTM6MzY6MDAsREdfQ2FsbF8xXzJfMjAxNzEwMTENClJ1c3NlbCxLcmFma2EsNDAyNDQwNDczNCwsVVRDLDE2OjAwIC0gMTk6MDAsRG9sbGFyIEdlbmVyYWwsLDgwNzYyMTUsMTk4Ny0wMS0zMSw0MDIgTiAxNFRoIFN0cmVldCwsLEFzaGxhbmQsTkUsNjgwMDMsTSxDLUFEViAgICwyMDE3LTA5LTE3IDEzOjM2OjAwLERHX0NhbGxfMV8yXzIwMTcxMDExDQo= --2e137bbb-bc14-4d3e-b4bf-138af85e43c7--

    Method 2 response:

    HTTP/1.1 400 Bad Request Server: nginx/1.10.3 Date: Fri, 13 Oct 2017 14:36:03 GMT Content-Length: 0 Connection: keep-alive Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization Access-Control-Allow-Methods: POST Access-Control-Allow-Origin: * ININ-Correlation-Id: 992925d8-fb20-40df-9142-37c9d1ebd743


    Craig.Dahlinger | 2017-10-13 15:20:32 UTC | #8

    here is an example curl statement that works:

    curl -X POST \ https://apps.mypurecloud.com/uploads/v2/contactlist \ -H 'authorization: BEARER youre token here' \ -H 'cache-control: no-cache' \ -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \ -F file=path to your file on your machine


    Nathan_Suiter | 2017-10-13 19:58:16 UTC | #9

    thank you for the curl example - that was exactly what I needed to be able to find what was wrong with my code. Here is the final result which will hopefully be found by someone else encountering this same issue:

    //parameters set string accessToken = token; string filePath = fp; string listName = "DS Test List";

    //instantiate HttpClient var client = new HttpClient(); //add access token client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BEARER", accessToken);

    //query outbound api using list name to get id for upload string fullUri = "https://api." + host + "/api/v2/outbound/contactlists?name=" + listName; var listResult = await client.GetAsync(fullUri); var UserInfo = await listResult.Content.ReadAsStringAsync(); var parsedList = JObject.Parse(UserInfo); string contactListId = (string)parsedList["entities"][0]["id"];

    //read file to upload into stream var stream = new FileStream(fp, FileMode.Open); string name = Path.GetFileName(fp); var streamContent = new StreamContent(stream); streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data"); streamContent.Headers.ContentDisposition.Name = "\"file\""; streamContent.Headers.ContentDisposition.FileName = "\"" + name + "\""; streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

    //add string parameters var values = new[] { new KeyValuePair<string, string>("\"id\"", contactListId), new KeyValuePair<string, string>("\"fileType\"", "contactlist") };

    //create multi-part form data content - note the boundary has to be set here MultipartFormDataContent content = new MultipartFormDataContent("----WebKitFormBoundary7MA4YWxkTrZu0gW"); client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue() { NoCache = true };

    //add file to uplaod to mult-part form content.Add(streamContent);

    //add string values to multi-part form foreach (var keyValuePair in values) { var parameter = new StringContent(keyValuePair.Value); content.Add(parameter, keyValuePair.Key); }

    //post upload var contactList = await client.PostAsync("https://apps." + host + "/uploads/v2/contactlist", content);


    Craig.Dahlinger | 2017-10-17 12:50:42 UTC | #10

    great news, glad I was able to help you out!


    system | 2017-11-17 12:50:52 UTC | #11

    This topic was automatically closed 31 days after the last reply. New replies are no longer allowed.


    This post was migrated from the old Developer Forum.

    ref: 1941