What Kalup can reach, and how.
Every resource type, whether Kalup can read it and write it today, and how a change will reach the portal. Where HubSpot has no API, the plan says so.
Resource types.
This table is kept by hand, not generated. Properties, groups and custom object schemas follow the endpoint registry, the one place Kalup pins each HubSpot API version. The other types follow the roadmap. Read and write are labelled separately. Live runs on a developer test account back property and group reads and writes; other account types are not verified yet.
| Resource | Address | Read | Write | Transport | Identity | Notes |
|---|---|---|---|---|---|---|
| Properties | property:… | 0.2 | 0.2 | public-api | natural | A live test restored an archived property by creating its name again. Kalup blocks that create; whether record values return is unverified. |
| Property groups | group:… | 0.2 | 0.2 | public-api | natural | |
| Custom object schemas | object:… | 0.2 | Next | public-api | natural | |
| Pipelines | pipeline:… | Next | Next | public-api | natural | Natural only if HubSpot honours a pipeline ID on create. Unverified; if not, pipelines become bound. |
| Pipeline stages | stage:… | Next | Next | public-api | natural | Required properties per stage and stage automation have no API, and a plan will say so. |
| Association labels | association:… | Next | Next | public-api | bound | Bound until a live test shows the label name comes back on read. |
| Lists | list:… | Later | Later | not decided | bound | HubSpot assigns the ID, and listing lists is a POST. Reads come before writes. |
| Forms | form:… | Later | Later | not decided | bound | Legacy v3 or the 2027-03 beta, decided by a live test of both. |
| Workflows | workflow:… | Later | Later | public-beta | bound | Will sit behind a per-resource flag. Update is a full replace, delete cannot be undone, names are not unique. |
- Transport
- public-apiThe change goes through a public API.
- public-betaA documented beta API. It will stay off until you turn it on per type in config.
- runbookNo API. The plan will print the steps for a person to do.
- not decidedNot decided yet.
- Identity
- naturalYou set a permanent key, and Kalup matches on it.
- boundHubSpot assigns the ID. State will tie the address to it per target.
- Not reachable yet: sequences and sales email templates need user-level OAuth, which a target does not hold.
No API, no pretending.
These settings have no public write API. The tag on each says when a plan names it, in one line per type, so nobody assumes it was copied: today for the types Kalup reads, later for the rest. Runbooks in the words of the HubSpot UI, with the page, the fields, the values and a check, come later. Kalup never claims a change it did not make.
- Record page layouts0.2
- Saved views0.2
- Conditional property logic0.2
- Required properties per stageNext
- Pipeline automationNext
- Permission setsLater
Not copied, HubSpot has no API: conditional property logic, field-level permissions.
Runbook steps, and kalup attest to record that a person did one, come later. Edits to these settings are invisible to any API, so Kalup will label them unverifiable.
Not confirmed yet.
A few HubSpot behaviours are not documented, or have been seen on one developer test account only. Each stays labelled here until live tests settle it, and Kalup treats it as unknown until then.
- question 1unverified
Is a pipeline ID honoured on create, and what does PUT do to stage IDs?
Whether pipelines are natural or bound.
- question 2unverified
Does an association label's name come back on read?
Whether association labels are natural or bound.
- question 3unverified
What does HubSpot rewrite when a property of another type is created, on other account types?
How live properties are normalized.
Observed 2026-09-29 on a developer test account: nothing, for a text and an enumeration property. Every owned field read back as sent.
- question 4unverified
Which scopes can a service key hold, and does every account type return the daily rate-limit headers?
The daily budget check. Without a daily figure it is skipped with a warning.
Observed 2026-09-29 on a developer test account: a service key's answers carry X-HubSpot-RateLimit-Daily and -Daily-Remaining.
- question 5unverified
How long is the read-after-write lag on other account types and under load?
The read-back timeout.
Observed 2026-09-29 on a developer test account: a new property showed in the single read after about 0.4 seconds and in the list after about 0.65 seconds.
- question 6unverified
Do record values come back when an archived property's internal name is created again?
Whether restoring is a real way back from a delete.
Observed 2026-09-29 on a developer test account: creating the name restores the archived property rather than making a new one, on companies and on a custom object. Plan blocks that create and says so.
- question 7unverified
Does the API refuse to archive a property used in a workflow, list or form, and is there any public "where used" read?
The docs for a delete say HubSpot refuses to archive a property in use and that Kalup does not check uses first; apply reports such a refusal as rejected.
Observed 2026-09-29 on a developer test account: HubSpot refused to archive a property a calculation property uses (400, CANNOT_DELETE_PROPERTY_IN_USE). Apply reports that delete as rejected, saying the property is in use.
- question 8unverified
Which editor do forms created by the legacy v3 API and by the 2027-03 beta open in?
Which forms API Kalup builds on.
- question 9unverified
Is there any scope introspection for service keys?
Until then, the preflight probes each list path and reads a 403 as a missing scope.
- question 10unverified
Does a single read of a sensitive property without its data sensitivity answer 404?
Apply's check before a write and its read-back. Until settled, a 404 means not found by that query, never gone.
Observed 2026-09-29 on a developer test account: a single read answers 404 for an unknown name, with or without a data sensitivity.
- question 11unverified
Do the sensitive and highly sensitive property lists answer on lower tiers?
Whether a read is complete. Until settled, a 403 on either is a gap that leaves the object incomplete.
Observed 2026-09-29 on a developer test account: both lists answer with crm.schemas scopes, on companies and on a custom object.
- question 12unverified
What does a create of an archived group's name do, and does any account type list archived groups?
Which creates a plan blocks for a name HubSpot archived. Until settled, plan blocks an archived group's name only where the list shows it.
Observed 2026-09-29 on a developer test account: an archived group leaves the groups list, so plan's check for one never fires there. The archived properties list filters by data sensitivity.
- question 13unverified
Is one crm.objects read scope enough for Limits Tracking, and which scopes does a write key need for the reads apply makes?
The scopes init and the docs ask for. Until settled, a write key also needs the read scopes of what it manages.
Observed 2026-09-29 on a developer test account: account info answers a key with crm.schemas scopes only. Limits Tracking custom-properties answers it 403, so init and the docs recommend one crm.objects read scope, and plan warns when it cannot check the property limit.
- question 14unverified
Does every account type answer a create of a name that already exists the same way?
How apply settles a rejected create. It reads again and treats a present resource as uncertain.
Observed 2026-09-29 on a developer test account: 409 OBJECT_ALREADY_EXISTS, with the property unchanged.
- question 15unverified
Does every account type replace the whole options list on a property update?
The options payload. Apply sends no options unless one changes, then the full live list.
Observed 2026-09-29 on a developer test account: an option left out of the list is removed, and an update without options keeps them.
- question 16unverified
Can a group be restored, and does every account type archive a group that holds only archived properties?
Group deletes. Until settled, plan and apply block one while any property, active or archived, names the group.
Observed 2026-09-29 on a developer test account: archiving a group that holds an active property is refused (400), and both stay active. The run's cleanup archived groups whose properties were all archived.