'An undeclared property' when trying to create record via Web API

After a good night's sleep I realised my error. To set the value of a lookup field, you need to use the relationship scheme name, and not the property name.

Once I changed that, all worked fine.


While the accepted answer is correct in this instance, it doesn't seem to be the whole story. In some cases it's necessary to use <logical name>_<entity name>. For instance when doing a POST sharepointdocumentlocations, I had to use:

"[email protected]": "/contacts(xxxx)"
"[email protected]" "/sharepointdocumentlocations(xxx)"

This may be something to do with the fact that those relationships can point to more than one type of entity, but I haven't found any Microsoft documentation about it.


When you want to set the value of a lookup field during the creation or update of a (new) record via the web API, you have to use either the Schema Name or the Logical Name of the lookup followed by the bind annotation.

  • For default fields like primarycontactid the logical name has to be used (first column in the screenshot).
  • For custom fields like rob_FaqId the schema name has to be used (second column in the screenshot).
var params = {
    '[email protected]': '/rob_faqs(guid-here)',
    'rob_source': 180840000,
    'subject': 'Signpost',
    'actualstart': new Date(),
    'actualend': new Date()
};

Screenshot of a solution > entities > your entity > fields: Schema Name of the field

So the general structure to create a new record with an already set lookup field via the web API is this:

{
  "[email protected]": "/relatedentitys(guid)" //don't forget the plural 's'
}

Or another example from the official documentation. How to create a new account record and directly assign an already existing contact as the primary contact.

var newAccountRecordObj = {
  "name": "Sample Account",
  "[email protected]": "/contacts(00000000-0000-0000-0000-000000000001)"
}