Direct REI has a REST API and outbound webhooks, so external tools — Zapier, lead-gen forms, spreadsheets, your own scripts — can talk to your CRM directly. Available on every paid plan.
Get an API key
Go to Settings → API & Zapier and click + Create API key. The full key is shown once — copy it right away. If you lose it, revoke it and create a new one (you can hold up to 5 active keys, and only the account owner can manage them). Send the key on every request as a header: Authorization: Bearer drei_…
What the API can do
- Import leads — POST /v1/contacts creates contacts (one or up to 100 at a time). Duplicates are detected by email and by phone in any format, and you choose what happens: skip them (default), update the existing contact, or create anyway. Each contact can carry up to 10 tags — send them as a list or as one text value separated by commas (
zillow, hot, tx-land). Updating an existing contact adds the new tags and never removes one. - Export leads — GET /v1/contacts lists your contacts with filters (role, status, tag, market, created/updated since) and pagination. It includes fields the CSV export doesn't, like extra phones and emails. Contacts carry their
websiteandsocial_links(up to 6 public profile links) too — send them when you create or update a contact to help each contact's Personalized Line. - Update a contact — PATCH /v1/contacts/:id changes fields, adds/removes tags, or appends a note.
- Enroll in a campaign — POST /v1/contacts/:id/enroll adds the contact to a campaign's member list. This is membership only — no message is queued by the API itself (see the automation tip below).
- Create and launch campaigns — POST /v1/campaigns creates a text, email and/or cold-call campaign with its message (several channels become a group). POST /v1/campaigns/:id/contacts adds contacts to it (created or matched, up to 100 at a time), and POST /v1/campaigns/:id/launch turns it on and queues message 1 for everyone in it. Sending runs exactly like the app: your mailboxes and numbers, your send hours, spacing between sends, opt-outs, and never the same message twice. Campaigns are created paused, so nothing goes out until launch. AI-call, voicemail-drop and direct-mail campaigns are made in the app.
- Deal blasts to your buyers — create the campaign with
"deal_blast": trueand the property'sproperty_id: one message by text and/or email, buyers marked Active, Qualified or Replied still get it (only Not interested is skipped), and deal blasts don't count toward your plan's campaign limit. - Your own ids — contacts and properties take an
external_id: your id for the record in your own CRM. Contacts are matched on it first, and every webhook carries it, so your system can match events to its own records. - Properties and websites — POST /v1/properties creates a property (or updates the one with your id), POST /v1/properties/:id/photos adds photos from image links, and POST /v1/sites/:id/listings puts it on one of your websites and answers with the page's link.
- Read-only lists — GET /v1/deals; GET /v1/campaigns and /v1/properties list the rest.
- Test a key — GET /v1/me answers with your account name and plan (Zapier connection tests use this).
Requests are limited to 120 per minute per account. The full reference with copy-paste examples lives at directrei.com/api-docs.
Webhooks: trigger Zaps instantly
Webhooks push events TO your tools the moment they happen. Pick only the ones a workflow needs:
- New lead — a contact is created (from ANY source: the API, a CSV import, your website's lead form, Property Records imports).
- Lead replied — a contact's status becomes replied.
- Lead qualified — a contact's status becomes qualified, whether you or a teammate set it, the AI marked a reply qualified, or the lead was added already qualified. The event also says which status the lead moved from. Use it to hand qualified leads to another system (an acquisitions CRM, a GoHighLevel pipeline) without sending every new lead or reply.
- Opted out — a contact opts out of email or texts (the event says which channel).
- Message sent — a text or email went out (a campaign message, one you sent by hand, or an AI reply).
- Message received — a contact texted or emailed in, with the text. Automatic email replies like out-of-office aren't sent.
- Message failed — a campaign message failed for good, or an email bounced.
- Call logged — a call outcome landed on the contact (a Dialer result like Interested or No answer, an AI call's result, or a missed call).
- Link clicked — a contact clicked a tracked link in a campaign message.
- Website form — someone filled in a form on one of your websites, with the property page it came from.
The message, call, click and form events each name the contact (with your external_id) and the campaign. Carriers don't tell us when a text is delivered, so there's no "delivered" event, and email opens aren't tracked.
Each delivery is one JSON event with the contact's details, signed with a secret you can view under the webhook's Secret button. Failed deliveries retry automatically; a webhook that keeps failing is paused and you get an email. Use the Test button to fire a sample event any time — it sends a sample of the first event the webhook is set to receive.
Zapier recipes
- Trigger (Direct REI → your Zap): in Zapier, add Webhooks by Zapier → Catch Hook and copy its URL. In Settings → API & Zapier click + Add webhook, paste the URL, pick your events, then hit Test so Zapier sees a sample.
- Action (your Zap → Direct REI): add Webhooks by Zapier → POST, set the URL to the base URL + /contacts, set Payload Type to json (it defaults to form — the #1 mistake), add a header
Authorizationwith your key, and map your fields (name, email, phone, market, tags…). For several tags, type them in the one tags field separated by commas —zillow, hot, tx-land.
Auto-start a campaign for imported leads
Want API-imported leads texted or emailed automatically? Use an automation: Tasks → Automations → New rule — trigger When a new lead is added, condition only if Source is api, action Enroll in a campaign. The automation enrolls them AND queues the campaign's first message, with every compliance gate (opt-outs, engaged statuses) applied.