Api & Custom Fields

Looping in one of Asana’s Developer Relations Leads, @Matt_Bramlage, who I’m hoping can help get your issue addressed! :slight_smile:

1 Like

Hi there!

Sorry for such a long delay - things have been quite active over here!

Setting custom fields with input being form data can be quite tricky. If you’re using JSON, your format is spot on:

"data": {
    "custom_fields":{
        318336795802518:318336795802520
    }
}

with form data (which is what --data-urlencode sends, setting the content type to application/x-www-form-urlencoded) you have to get the path specifier just right in order for it to work. This means a successful request would be

curl --request PUT -H "Authorization: Bearer MYAPIKEY" \
https://app.asana.com/api/1.0/tasks/3184015682564611 \
--data-urlencode "custom_fields.318336795802518=318336795802520"

Hopefully this will work for you!

I’m not able to update the custom fields and get “errors”:[{“message”:"custom_fields: Value is not valid JSON:

{ 
  "id":392096801051329,
  "custom_fields":{
    "24321869754625":"Test", 
    "188798652655039":197365168746421 
  },
  "due_on":"2017-08-01",
  "name":"James",
}   

It seems to be in the format provided and If I remove the custom_fields parameter I am able to update my task. What is missing?

2 Likes

Hello,

I would like to recover my tasks with the custom field and others information but I can’t do it.
Can you give me the URL knowing I have this one for now et I want to have theses information too.
https://app.asana.com/api/1.0/projects/557333570332796/tasks?opt_fields=name,due_on,completed,assignee,memberships.section.name&opt_pretty

Thank you !

Same boat here as James_Ferreira. I can’t seem to update the custom field no matter what kind of format I try.

  var headers = {
    'Authorization': 'Bearer API_KEY'
  };
  
  var formData = "custom_fields.661393451384417=123";
  
//  var formData = {
//    'custom_fields': {661393451384417: 123},
//  };

  //formData['custom_fields'][fieldId.toString()] = value;
  var options = {
    'method': 'put',
    'headers': headers,
    'payload': formData
  };
  var response = UrlFetchApp.fetch('https://app.asana.com/api/1.0/tasks/' + taskId, options);
  Logger.log(response.getContentText());
}

What are we doing wrong?

1 Like

Did you ever hear back from anyone? I’m stuck in the exact same situation. Thanks!

This does not work. Even on regular CURL on the terminal I get “Could not interpret 683685779381761 as an identifier in custom_fields.683685779381761”

This is the CURL request and I am trying to set an number custom field
curl --request PUT -H “Authorization: Bearer MYKEY”
https://app.asana.com/api/1.0/tasks/686202313755564
–data-urlencode “custom_fields.683685779381761=36”

Please Advise

Did anyone get a response to this issue? I am having the exact some problem. I’ve tried every different combination of calls without success.

Help!

Thanks

1 Like

Hi James,

Can you post some specific code that you’ve tried which hasn’t worked? I think having that as a starting point might make it easier to provide some advice.

Phil_Seeman, nothing form the suggested above does not work. We need just working example of how to update custom field

@Matt_Bramlage Hey Matt, these guys are correct - I just tried the CURL syntax you suggested above (and a bunch of variations of it) and got the same error.

For example, given a task with a text custom field having id 744020393575926, if I do:

curl --request PUT -H "authorization: Bearer MY-PERSONAL-ACCESS-TOKEN" https://app.asana.com/api/1.0/tasks/718125926216046 --data-urlencode "custom_fields.744020393575926=A field updated from CURL"

that results in the error Could not interpret 744020393575926 as an identifier in custom_fields.744020393575926.

1 Like

Method 1 (with 2 goes at the correct uri):

Dim uri1 As String = String.Format(“https://app.asana.com/api/1.0/tasks/{0}?custom_fields:{1}:{2}”, taskId, customFieldId, value)
Dim uri2 = String.Format(“https://app.asana.com/api/1.0/tasks/{0}?custom_fields.{1}={2}”, taskId, customFieldId, value)

    Dim request As HttpWebRequest = WebRequest.Create(uri1)
    request.Headers.Add(String.Format("Authorization: Bearer {0}", token))
    request.Method = "PUT"
    request.ContentType = "application/x-www-form-urlencoded"

    Dim response As HttpWebResponse = request.GetResponse()

Method2:

Dim uri As String = String.Format("tasks/{0}", taskId)

    request.Headers.Add(String.Format("Authorization: Bearer {0}", token))
    request.Method = "PUT"
    request.ContentType = "application/json"

    Dim cfParams As New Dictionary(Of String, Object)
    cfParams.Add(customFieldId, value)

    Dim parameters As New Dictionary(Of String, Object)
    parameters.Add("custom_fields", cfParams)

    Dim json As String = JsonConvert.SerializeObject(parameters)

    Using writer As New StreamWriter(request.GetRequestStream())
        writer.Write(json)
    End Using

    Dim response As HttpWebResponse = request.GetResponse()

Any guidance/help would be much appreciated.

Regards

@James_Cullis

Your Method 2 looks very close; just add this extra line below your “SerializeObject” line:

Dim json As String = JsonConvert.SerializeObject(parameters)
json = "{\"data\":" + json + "}"

Also, I set the following on my request object (this is in C#):

            request.AllowWriteStreamBuffering = false;
            request.ContentType = "application/json";
            request.Accept = "Accept=application/json";
            request.SendChunked = false;
            request.ContentLength = json.Length;

Great thanks. That has worked :slight_smile: I think the API reference could be clearer and provide a code example using the parameters you outlined (and maybe in a couple of different languages). Just for clarity!

1 Like

PHP example that works for me.

$taskId = ‘830265114072917’;
$customFieldId = ‘832291596179375’;
$value = ‘test value’;

    $data = [
        'data' => [
            'custom_fields' => [
                $customFieldId => $value
            ]
        ]
    ];

    $url = 'https://app.asana.com/api/1.0/tasks/%s';
    $url = sprintf($url, $taskId);

    $fetch_request = curl_init($url);
    curl_setopt($fetch_request, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
    curl_setopt($fetch_request, CURLOPT_HEADER, false);
    curl_setopt($fetch_request, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($fetch_request, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($fetch_request, CURLOPT_FOLLOWLOCATION, 0);
    curl_setopt($fetch_request, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($fetch_request, CURLOPT_POSTFIELDS, json_encode($data));

    curl_setopt($fetch_request, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        "authorization: Bearer $this->secret",
    ]);


    $response = curl_exec($fetch_request);

    $result = json_decode($response, true);
1 Like

Hi @Matt_Bramlage

How can I specify multiple custom fields in the one packet? I have tried making "custom_fields
an array but it won’t work. If custom_fields is specified more than once, the last one wins.

I can’t work out how to create a task and specify multiple custom fields in one call.

Your assistance would be greatly appreciated.

Thanks in advance
Joe

Hey all, catching back up on backlog here.

@Phil_Seeman It’s not well documented (I’ll create a follow up task to fix this) but indexing into arrays using form data is done with square brackets both for offset-based arrays (like collaborators[0], collaborators[1]) and for associative arrays (using IDs). Try:

curl --request PUT -H "authorization: Bearer MY-PERSONAL-ACCESS-TOKEN"
https://app.asana.com/api/1.0/tasks/718125926216046 --data-urlencode
"custom_fields[744020393575926]=A field updated from CURL"

This is also how you can set multiple fields at once @joehanna - by sending multiple --data-urlencode command line params with different custom fields indexed this way I was able to check that this did the right thing:

curl -v -H "Authorization: Bearer $ASANA_PERSONAL_ACCESS_TOKEN"
--request POST --data-urlencode "projects=$ASANA_SANDBOX_PROJECT"
--data-urlencode "custom_fields[166943917002516]=Some string"
--data-urlencode "custom_fields[158477440529071]=5"
https://app.asana.com/api/1.0/tasks
2 Likes

Thanks for your quick reply @Matt_Bramlage. Much appreciated

Any solutions on this for JavaScript / App script?
Getting the same error:

Hi @p-g,

In the code you referenced, the gid 197365168746421 needs to be a string, that is, needs to have quotation marks around it.

1 Like