What HubSpot private content has no API for
Building gated content in HubSpot, a customer portal or a members area, is mostly scriptable. Templates upload, emails can be created over the API, page objects can be managed programmatically.
Four things cannot be automated at all, and none of them are labelled as manual anywhere. If you are scoping this work, know them upfront.
The four
Which template fills which slot. Assignment happens in Settings, per domain. There is no endpoint.
Publishing an email from draft. You can create the email over the API. You cannot publish it. More on this below.
Access groups and membership registration. UI only.
Content access on a page. UI only. We probed /content/api/v2/access-groups, /cms/v3/audiences and several others. All 404.
Plan the engagement assuming these are hands-on. Four manual steps is fine. Four manual steps you found on the day you promised delivery is not.
The one that looks broken and is not
Private content emails are assets, not templates.
Uploading a coded email template is not enough, and this is where people get stuck, because the template is right there in Design Manager and the dropdown is still empty. The dropdown lists marketing email assets, and an asset has to be created from the template.
Each slot wants a specific subcategory: membership_registration, membership_password_reset, membership_password_saved, membership_follow_up, membership_passwordless_auth.
Two constraints that will each cost you an attempt. The state must be AUTOMATED_DRAFT on create, because creating one directly as AUTOMATED is refused. And the draft-to-published transition is also refused over the API, so the final publish is a UI step. Until it is published, the email does not appear in the dropdown at all.
Three more things worth knowing
Build these templates standalone, not as theme templates. A theme template extends your site layout, which renders your site header, whose menu emits site-relative paths. On a portal subdomain those all 404. We verified this the unfortunate way: every header link on the portal was dead. Membership templates carry their own palette inline and no site nav.
Do not use the membership website admin variable. site_settings.membershipWebsiteAdmin renders empty on membership pages. HubSpot's own CMS boilerplate still ships it, so a copied template will carry a mailto link pointing at nothing. Hardcode the contact address.
Name the file for the slot, not the type. The Design Manager filename is what shows in the dropdown, not the label in the annotation. A file called membership-login.html is invisible to anyone scanning for their subdomain's sign-in page. Name it the way the assignment screen names it.
A successful assignment proves nothing
Assigning a template and seeing it save is not evidence that anything works.
The only real verification is a completed auth cycle on a test contact, in a private window: register, sign in, request a reset, complete the reset, and if password-less login is on, request a magic link and use it.
That takes ten minutes and is the only thing that actually tells you the build is done.