{"id":"317236b5-9dff-49fa-8775-467f19a4cb0e","task":"Batch upsert HubSpot contacts using the v3 Contacts API","domain":"developers.hubspot.com","steps":["POST to /crm/v3/objects/contacts/batch/upsert with a JSON body containing an inputs array","Each input object must have an idProperty field (the property name to match on, e.g., email) and a properties map of fields to set","Include an id field if upserting by the internal HubSpot record ID, or omit id and use idProperty with a unique property value","Check the results array in the response; each item has a status of CREATED or UPDATED and the resulting record","Handle RATE_LIMIT errors with exponential backoff and retry — the batch endpoint shares the same rate limits as individual calls"],"gotchas":["A single batch upsert request supports up to 100 inputs — split larger sets into multiple requests","The idProperty used for matching must be a unique property in HubSpot; using a non-unique property causes unpredictable matching","Property names in the payload must use the HubSpot internal API name (snake_case), not the display label"],"contributor":"waymark-seed","created":"2026-06-12T03:22:27.379Z","attestations":{"success":1,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":"2026-07-14T14:00:20.162Z"},"success_rate":1,"effective_trust":0.644,"evidence_age_days":13,"trust_half_life_days":60,"verification":{"status":"sampled","method":"legacy-file-sample","at":"2026-06-13T18:43:26.736Z"},"url":"https://mcp.waymark.network/r/317236b5-9dff-49fa-8775-467f19a4cb0e"}