I tried running this locally, and it works perfectly fine, but on the live server, there's no exception thrown and it returns linktoken and exception null.
public async Task<CreateLinkTokenResult> GetPlaidLinkToken()
{
var linkToken = await _client.CreateLinkToken(new CreateLinkTokenRequest()
{
ClientId = _clientId,
Secret = _secret,
User = new CreateLinkTokenRequest.UserInfo
{
ClientUserId = _userContext.CurrentUser.UserId,
},
CountryCodes = new[] { "US" },
ClientName = "TestClient",
Products = new[] { "transactions" }
});
return new CreateLinkTokenResult
{
Expiration = linkToken.Expiration,
LinkToken = linkToken.LinkToken
};
}
{
"data": {
"linkToken": null,
"expiration": null
},
"exception": null,
"errorMessage": "",
"statusCode": 200
}
This is the response I get in the live server:

Very weird. This is a bit of a guess, but have you considered contacting the author of the SDK you're using? I noticed you tagged this with C# and .NET, which have community (unofficial) SDK support. According to our API documentation the link_token and expiration responses from /link/token/create are not nullable, so it should never be possible to get the results you're seeing from the API, which makes me think that potentially the problem could be happening at the SDK layer. Does the issue still happen if you don't use an SDK and just make raw POST requests?
If that doesn't resolve your problem, please feel free to file a Plaid support ticket.