Find before creating
Search Contacts withGET /api/v2/contact using exact identifiers or q, and follow the returned pagination. Reuse the existing Contact when one represents the same person.
Create or update with the documented Contact routes, then read the persisted Contact before continuing.
Represent one ongoing objective
Use one stable Contact List name for each ongoing objective. Before creating a new list, inspect existing names and reuse an exact match instead of creating a synonym. Enroll a Contact and merge compact state with:PATCH /api/v2/contact/{contactId}/list/{listName}/state
Useful state can include the current phase, a next action, a not-before time, the last outcome, and small objective-specific data. These are workflow vocabulary, not a required universal state machine.
Continue work from evidence
Before taking the next action:- Read the Contact and its matching objective state.
- Inspect related active Tasks and recent Contact communication logs.
- Read current source-system data when it affects the decision.
- Respect the recorded not-before time unless new information requires reevaluation.
- Perform and verify the action.
- Patch the outcome and next action.
Keep state compact
Do not store transcripts, complete API responses, credentials, cookies, or copied source records in Contact custom fields. Store only the facts required for the next decision and remain within the documented size limit. Remove a Contact from the objective only when the objective is truly complete or abandoned. Waiting, paused, cooling-down, and blocked Contacts should stay enrolled and record that state.For recommended state shapes and request templates, use the Vida API Skill.