Look up by email
POST /contacts/lookup
200 OK with data: null when no active contact exists.
Upsert by email
POST /contacts/upsert
created: true or created: false. Email is normalized per
project and concurrent requests resolve to one active contact.