Hi all,
We have a marketplace app (OAuth, portal-level, isUserLevel: false) that creates contacts and writes timeline events. Its granted scopes are: (crm.objects.contacts.write, timeline, oauth)
No contacts read scope, and it has never had one.
What changed
Until 2026-08-07, PATCH /crm/v3/objects/contacts/{email}?idProperty=email succeeded with those scopes. We have 556 successful updates across 20 connected accounts going back to November 2025.
![]()
From 2026-08-12 onward, the identical call returns 403:
{
“status”: “error”,
“message”: “Property validation failed. Required scopes: CRM_ACCESS or CONTACTS_READ”,
“category”: “FORBIDDEN”
}
with no change on our side. No deployments, no app configuration changes, no scope changes, and no code touching this path since June 3.
What the docs say
Both per-operation reference pages for updating a contact list only crm.objects.contacts.write:
-
Update a contact - HubSpot docs
I could not find any changelog entry covering this. The closest is the Aug 11 “CRM API Write Validation Enforcement” post, but that is scoped to /2026-09/, takes effect September 8, and returns 400 VALIDATION_ERROR. Ours is 403 FORBIDDEN on unversioned /crm/v3 and started on Aug 12.
Questions
- Was a read scope requirement added to contact update paths on or around Aug 12, 2026? If so, where was it announced?
- Is this intended behavior or a regression? The error text references the legacy scope names CRM_ACCESS and CONTACTS_READ rather than the granular crm.objects.contacts.* names, which made me wonder whether an older internal check is being applied.
- If read is now genuinely required, will the reference docs be corrected?
- When a required scope is added to an existing marketplace app, do current installs receive it on the next token refresh, or does every portal have to re-authorize? This determines whether we need to ask 20+ customers to reconnect, so we would rather confirm than guess.
