API Contact ignore property field hs_marketable_status

Hello,
I’m having issues with the hs_marketable_status and hs_marketable_reason_type properties when creating a contact in HubSpot via the API.

Problem When trying to create a new contact using the following endpoint:

https://api.hubapi.com/crm/v3/objects/contacts/batch/create

with this payload:

{
 "inputs": [
 {
 "properties": {
 "email": "example@hubspot.com",
 "firstname": "Jane",
 "lastname": "Doe",
 "phone": "(555) 555-5555",
 "hs_marketable_status": "true",
 "hs_marketable_reason_type": "INTEGRATOR_SET"
 }
 }
 ]
}

The API ignores the hs_marketable_status field entirely and set it to false (also ignore hs_marketable_reason_type but this is not relevant now). I have tried providing these values as strings, booleans, or even irrelevant strings like “Hello”, and nothing seems to work. The values are not validated and appear to be simply ignored.

I used different methods to send requests:

Additional Context:

I understand that hs_marketable_status is a read-only field that cannot be edited after creation. However, my goal is to create contacts as marketable from the beginning using the API.

Questions:

  • Is hs_marketable_status dependent on another property or configuration?
  • Is there any official documentation that outlines how to set this property during contact creation?
  • Is there a workaround to set contacts as marketable from the start?

Any help or insight would be greatly appreciated!

Hey, @TTweave :waving_hand: You are not missing anything here. These two properties are set as “read only”. Meaning, they cannot be updated via an API call. The available methods for setting a Contact’s Marking status are laid out here — Set Contacts as Marketing.

In my use cases, when I run into issues like this, I’ll make a request to the Properties API and look for the `modificationMetadata` details in the response.

Example:

Request

curl --request GET \
 --url 'https://api.hubapi.com/crm/v3/properties/contacts/hs_marketable_status?archived=false' \
 --header 'authorization: Bearer YOUR_ACCESS_TOKEN'

Response (edited to only show the modificationMetadata)

 "modificationMetadata": {
 "archivable": true,
 "readOnlyDefinition": true,
 "readOnlyValue": true
 },
 "formField": false,
 "dataSensitivity": "non_sensitive"

I hope this helps get you moving forward! — Jaycee

Thanks for the answer; it really helped me find this resource and understand how it works. It was as simple as toggling a button.

However, I still think there is something confusing about it. I knew that it was read-only, but I thought that, as in the frontend, we could only set it during creation but not change it later (as shown here). It seems I was wrong, but what made me think that—and is still very confusing—is that for other read-only fields like hs_email_optout, adding it to the properties returns this error:

“hs_email_optout” is a read-only property; its value cannot be set., error: READ_ONLY_VALUE

However, for the marketable fields, I didn’t get this error; the field was simply ignored, which made me think it wasn’t “fully” read-only, and that it could be set during creation like in the frontend.

Nevertheless, thank you for your answer. I ended up fixing my issue.

Hey, @TTweave! Thanks for letting us know that helped. I agree with you, I’d expect a validation warning when trying to set this via an API call. I’ll work on submitting this feedback internally.

Have a fantastic day! — Jaycee

@Jaycee_Lewis can you clarify or find out the rational for having this property as read only and not updatable by the API?

It is perfectly reasonable for enterprise customers to be managing consumer data outside of hubspot in a profile or identity store and create/update records from outside of HubSpot.

Having to add manual steps inside the console or workflows when it should be easily updateable via the API has no apparent logic or reasoning backing it up.

Thanks

Craig