Whilst developing an ASP.NET Core app for building and releasing Xamarin projects via the VSTS REST API, I came across a problem when trying to pass variables to the build server. For reference, I was trying to call the v4.1 API, and specifically the Queue build API which can be seen here. I needed to pass some user-defined variables to the build definition, and looking at the API docs, I could see an option to pass parameters in the Request Body which is defined as “The parameters for the build” and accepts a string; sounds fairly straightforward at first glimpse, but no matter what data assigned to the parameters argument I received a Bad Request (400) from the server. After hours of looking online, I came across this StackOverflow post which mentions passing a JSON formatted string - this was slightly annoying as I’d tried previously to send a POCO serialized as JSON but had no luck.


This was exactly the issue I was having, and below you can see the solution I ended up with:

The simplified controller endpoint:

public async Task<IActionResult> BuildApp(string appRequestId)
    var parameters = new Dictionary<string, string>
        { "VARIABLE_ONE", "DATA" },
        { "VARIABLE_TWO", "DATA" }

    var json = JsonConvert.SerializeObject(parameters);

    var appRequest = new BuildMobileAppRequest
        // Replace '1' with your definition id.
        Definition = new Definition(1),
        Parameters = json,
        Project = new AppProject("YOUR PROJECT ID"),
        // Replace '1' with your queue id.
        Queue = new AppQueue(1)

    // Serialize "appRequest" and build your app using the VSTS API
    var appRequestJson = JsonConvert.SerializeObject(appRequest);
    return Ok();

The POCOs to serialize:

public class BuildMobileAppRequest
    public Definition Definition { get; set; }		
    public string Parameters { get; set; }

public class Definition
    public int Id { get; set; }

    public Definition(int id)
	this.Id = id;

It would be really helpful for the Microsoft guys to add a note against their docs stating what format they require a string to be sent in as I couldn’t find any official documentation anywhere stating a JSON formatted string was required for this argument.

Hope this saves someone some time!