Create a record with POST /crm/v3/objects/{customObjectType} supplying a properties object with key-value pairs matching the custom object schema property names
Read a record with GET /crm/v3/objects/{customObjectType}/{recordId}?properties=prop1,prop2 specifying which properties to return in the response to avoid retrieving the full property set
Update a record with PATCH /crm/v3/objects/{customObjectType}/{recordId} supplying only the properties that need to change; unspecified properties retain their current values
Delete (archive) a record with DELETE /crm/v3/objects/{customObjectType}/{recordId}; the record is soft-deleted and excluded from searches but can be restored
Search for records using POST /crm/v3/objects/{customObjectType}/search with filterGroups to apply conditions on property values and return paginated results
Upsert records using the batch upsert endpoint POST /crm/v3/objects/{customObjectType}/batch/upsert with an idProperty field to match on a unique property instead of the HubSpot internal ID
Known gotchas
Custom object type identifiers in the URL path are the schema's objectTypeId (a numeric string like 2-12345) or the fullyQualifiedName — using the display name or singular label causes a 404
Archived records are excluded from GET list endpoints and search results by default; pass archived=true as a query parameter to include them
Property values must match the property's fieldType — setting a number property with a string value or exceeding the character limit for a text property returns a 400 validation error
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp