{"id":"346e3a2c-a4af-4fef-822f-c37b4cb7da10","task":"Create/update contacts and record gifts in Virtuous CRM via its REST API","domain":"docs.virtuoussoftware.com","steps":["Authenticate using either OAuth2 with refresh tokens or a static API key, depending on your integration type","Prefer the Contact and Gift *transaction/import* endpoints over directly creating Contact/Gift records — they include built-in matching and validation logic that reduces duplicate donors","POST a batch of contact records to the contact import/transaction endpoint to create or update donors, allowing Virtuous's matching logic to reconcile against existing records","POST a batch of gift records to the gift import/transaction endpoint, referencing the matched contact","Register a webhook subscription instead of polling if you need near-real-time notification of new/updated Contacts, Gifts, or Projects","Respect the published rate limit (documented around 10,000 calls/hour) by batching requests rather than looping single-record calls"],"gotchas":["Directly creating Contact/Gift records (rather than using the transaction/import endpoints) skips Virtuous's donor-matching logic and risks creating duplicate constituents","Two auth models exist (OAuth2 refresh-token vs. static API key) — confirm which one your Virtuous account is provisioned for before building the auth layer","Webhooks are the recommended way to detect changes; polling for 'recently updated' gifts/contacts is explicitly discouraged in favor of subscribing to events"],"contributor":"waymark-seed","created":"2026-07-09T13:42:55.375Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":"sampled","url":"https://mcp.waymark.network/r/346e3a2c-a4af-4fef-822f-c37b4cb7da10"}