Darwin Cloud

Vendor Data Intake Specification - Inbound

Updated on

AccountTECH — Darwin Cloud Integration1

Version 1.0

This document defines the required data format, delivery methods, and field mappings for third-party vendors providing transactional, agent, and lead-source data to Darwin Cloud. Adhering to these specifications ensures reliable data matching, accounting accuracy, and minimal manual intervention during integration.

This specification covers three primary data flows:

  • Transaction data — residential and commercial property transactions, including agents, commissions, ancillary participants, and referrals.
  • Agent roster information — for vendor systems that do not implement roster sync.
  • Buyer / seller lead-source data — for CRM and lead-tracking systems.

1. Transaction Data

Vendors provide transaction records in a single unified schema unless a separate schema is explicitly agreed upon during intake. Each record represents a single deal attempt on a property — pending, closed, or cancelled — and includes agent identifiers, commissions, property details, closing information, and any associated ancillary participants (title company, mortgage company, home warranty, etc.).

1.1 Transaction Lifecycle: Listing ID vs. Transaction ID

Most vendor systems model the property lifecycle with two distinct identifiers, and Darwin needs both:

  • Listing ID — persistent for the life of the listing. It does not change when a deal falls through and the property is re-marketed.
  • Transaction ID — created when a deal goes pending / under contract. If that deal falls through, the vendor typically cancels that Transaction ID and creates a new Transaction ID against the same Listing ID when the property re-lists.

If your system works this way, both identifiers are required. Provide the Listing ID on every record so Darwin can correlate multiple deal attempts on the same property.

How Darwin handles this on our end:

Darwin does not have a separate "listing" entity tied to a transaction. Darwin has a single Property record. The mapping works as follows:

  • A pending/active transaction maps to a Darwin Property record. The vendor Transaction ID is stored as the external reference (guid 3 on the Links tab) and the Listing ID is retained for audit correlation.
  • When a transaction comes through as cancelled on an incremental pull, Darwin cancels (does not delete) the corresponding Property record.
  • If the vendor later sends a new Transaction ID against the same Listing ID, Darwin creates a new Property record linked to the new Transaction ID, while both Darwin Property records continue to reference the same vendor Listing ID.

Why we model it this way: We deliberately keep a separate Property record for each deal attempt so the brokerage retains a complete record of every buyer and seller engaged on the property — including the lost revenue when a deal falls through. Cancelled deals must therefore flow to us (not be silently dropped), with the cancellation reason and date, so we can report on them.

1.2 Core Transaction Fields

Darwin Field NameField TypeRequiredVendor Field NameDescriptionNotes
transaction_idString (GUID / alphanumeric)Yes Vendor's unique transaction identifier for this deal attempt.Used for incremental pulls and single-record retrieval. Stored in Darwin as the external reference (guid 3, Links tab). One Transaction ID per deal attempt.
listing_idStringYes* Vendor's listing identifier, persistent across all deal attempts on the property.*Required if your system separates listing and transaction IDs. Links cancelled and re-listed transactions on the same property for revenue tracking.
statusString (code value)Yes Current transaction status.Must reference the Code Value API (Section 4). Examples: PENDING, UNDER_CONTRACT, ACTIVE, CLOSED, CANCELLED. Provide both ID and string value.
cancellation_reasonString (code value)Conditional Reason the transaction was cancelled.Required when status = CANCELLED. Must reference the Code Value API. Examples: FINANCING_FAILED, INSPECTION_ISSUE, APPRAISAL_ISSUE, BUYER_WITHDREW, SELLER_WITHDREW. Provide ID and string value.
cancellation_dateDateTime (ISO 8601)Conditional Date/time the transaction was cancelled.Required when status = CANCELLED. Subject to the timezone declaration in Section 1.3.
modified_dateDateTime (ISO 8601)Yes Last modification timestamp for the record.Drives incremental pulls. Must update on ANY change — agent edits, participant additions, status/commission changes, cancellations. Subject to the timezone declaration in Section 1.3.
company_idStringYes The Darwin company (brokerage entity) this transaction belongs to.Critical when the client operates more than one company in Darwin. Provided during onboarding. Be explicit — do not rely solely on office mapping.
office_idStringConditional Vendor office / branch code.Used to derive company routing when company_id is not explicitly supplied. Must map to a single Darwin company during onboarding.
property_addressObjectYes See Property Address (Section 1.4).Street, city, state, postal code. Used for property matching.
property_typeString (code value)Yes Property type.Code Value API. Examples: SFR, CONDO, TOWNHOUSE, COMM. Provide ID and string value.
transaction_typeString (code value)Yes Transaction type.Code Value API. Examples: SALE, LEASE, EXCHANGE. Provide ID and string value.
accounting_codeString (code value)Conditional Accounting classification code.Required for some brokerages. Code Value API. Provide ID and string value.
mls_numberStringConditional MLS number.Required if the transaction originated from an MLS. Secondary property identifier. Include board abbreviation where available.
list_priceDecimalConditional Original listing price (USD).Used for financial reporting accuracy.
sale_priceDecimalYes Final sale / contract price (USD).Used for commission calculations.
list_side_commissionDecimal + type flagYes Total list-side commission, expressed as either a percentage or a dollar amount.Indicate which: e.g. list_side_commission_type = PERCENT | AMOUNT. This is the total before splitting among multiple list-side agents.
sell_side_commissionDecimal + type flagYes Total sell-side (buyer-side) commission, expressed as either a percentage or a dollar amount.Indicate which: e.g. sell_side_commission_type = PERCENT | AMOUNT. Total before splitting among multiple sell-side agents.
list_side_agentsArray<Agent>Yes One or more agents on the list side. See Agent Reference (Section 1.5).Includes order (1 = primary) and per-agent commission split. In Darwin convention the seller-side agent record.
sell_side_agentsArray<Agent>Yes One or more agents on the sell (buyer) side. See Agent Reference (Section 1.5).Includes order (1 = primary) and per-agent commission split. In Darwin convention "SellAgent" = buy side (legacy naming).
participantsArray<Participant>No Ancillary parties on the property — title company, mortgage company, home warranty, etc. See Participants (Section 1.6).Each entry carries a participant type plus company and/or individual contact details.
referralsArray<Referral>No Out-of-office referral sources to be paid out. See Referrals (Section 1.7).Multiple referrals supported per transaction.
buyer_contactObjectConditional Buyer contact. See Contact Information (Section 1.8).Include where available for lead-source matching.
seller_contactObjectConditional Seller contact. See Contact Information (Section 1.8).Include where available for lead-source matching.
transaction_notesStringNo Free-text notes providing additional information about the transaction.Loaded into Darwin and displayed on the property/transaction record.

1.3 DateTime & Timezone Declaration

The DateTime fields above (modified_date, cancellation_date) carry a time component and must have a declared timezone. Complete the following during onboarding:

  • Are all DateTime values delivered in UTC (Zulu / GMT)? ☐ Yes ☐ No
  • If local time, specify the IANA timezone: ______________________ (e.g., America/New_York, America/Los_Angeles)

AccountTECH normalizes all timestamps to UTC for storage and consistency.

1.3a Transaction Dates (date-only)

The following are date-only fields (format YYYY-MM-DD, no time component). No timezone declaration is required for these.

Darwin Field NameField TypeRequiredVendor Field NameDescription
listing_dateDate (YYYY-MM-DD)Conditional Date the property was listed.
listing_expiration_dateDate (YYYY-MM-DD)Conditional Date the listing agreement expires.
pending_dateDate (YYYY-MM-DD)Conditional Date the deal went pending / under contract.
estimated_close_dateDate (YYYY-MM-DD)Conditional Estimated closing date.

1.4 Property Address

Darwin Field NameField TypeRequiredVendor Field NameDescription
street_addressStringYes Street number and name.
cityStringYes City or municipality.
stateStringYes Two-letter state / province code (e.g., CA, TX).
postal_codeStringYes ZIP / postal code (US: 5-digit or ZIP+4).
countryStringNo ISO 3166-1 alpha-2 (default US).

1.5 Agent Reference (per-side agent array)

Each side of the transaction is an array of agent objects. Use the order field to indicate ranking (1 = primary agent, 2 = secondary, etc.). Each agent carries a commission split that allocates that side's total commission.

Commission split rules:

  • As dollar amounts — each agent's amount must sum to the total side commission (e.g., $9,000 + $9,000 = $18,000).
  • As percentages — each agent's percentage is a share of that side's total commission and must sum to 100% (e.g., 50% / 50%, or 60% / 40%).
  • Indicate which method is used (e.g., split_type = PERCENT | AMOUNT).
Darwin Field NameField TypeRequiredVendor Field NameDescription
orderIntegerYes Ranking within the side. 1 = primary agent, 2 = secondary, etc.
split_typeString (PERCENT | AMOUNT)Yes Declares whether commission_split is a percentage of the side total or a dollar amount.
commission_splitDecimalYes This agent's share of the side's total commission. Percentages sum to 100%; amounts sum to the side total.
person_guidString (GUID)Conditional Darwin rep_person GUID (roster-sync vendors). Preferred identifier when available.
person_idIntegerConditional Darwin rep_person numeric ID (alternative to GUID).
vendor_agent_idStringConditional Vendor's agent ID, stored on the Darwin rep_person record for external-ID matching.
agent_nameStringYes Full name (Last, First preferred). Used for fuzzy matching when no linked ID exists.
agent_emailStringConditional Improves match accuracy.
agent_phoneStringConditional E.164 format recommended. Improves match accuracy.
office_codeStringConditional Vendor office/branch code; disambiguates agents with matching names.

1.6 Participants (Ancillary Vendors)

Ancillary parties attached to the property — mortgage company, title company, home warranty, etc. — are delivered as a participants array. Each entry declares its participant_type and may include both the organization and the individual working the transaction.

Darwin Field NameField TypeRequiredVendor Field NameDescription
participant_typeString (code value)Yes Type of participant. Examples: MORTGAGE_COMPANY, MORTGAGE_BROKER, TITLE_COMPANY, HOME_WARRANTY, INSPECTOR, APPRAISER, HOA, INSURANCE. Reference the Code Value API.
company_nameStringConditional Organization name (required when the company is being tracked).
company_idStringConditional Darwin vendor ID if already set up; otherwise the vendor's own company ID.
person_nameStringConditional Individual contact name (required when the person is being tracked).
emailStringConditional Email address. MUST be paired with email_owner.
email_ownerString (COMPANY | PERSON)Conditional Declares whether email belongs to the company or the individual.
phoneStringConditional Phone number (E.164 recommended). MUST be paired with phone_owner.
phone_ownerString (COMPANY | PERSON)Conditional Declares whether phone belongs to the company or the individual.
addressObjectConditional Participant address (same structure as Section 1.4). Aids disambiguation of the company/person record.

1.7 Referrals

Out-of-office referrals — a company that provided the buyer or seller and is paid out of the commission. Multiple referrals are supported per transaction. For each, declare how the referral is calculated: most often a percentage of GCI, occasionally a fixed dollar amount.

Darwin Field NameField TypeRequiredVendor Field NameDescription
referral_company_nameStringYes Name of the referring company.
referral_company_addressObjectYes Address of the referring company (same structure as Section 1.4).
referral_company_phoneStringYes Phone number of the referring company (E.164 recommended).
calculation_methodString (PERCENT_OF_GCI | FIXED_AMOUNT)Yes How the referral payout is calculated.
referral_valueDecimalYes The percentage of GCI, or the fixed dollar amount, per the calculation_method.

1.8 Contact Information (Buyer / Seller)

Darwin Field NameField TypeRequiredVendor Field NameDescription
contact_nameStringYes Full name (Last, First preferred).
contact_emailStringConditional Email address. Primary key for person matching.
contact_phoneStringConditional Phone number (E.164 recommended). Secondary match key.

2. Agent Roster Data (non-roster-sync vendors)

If a vendor does not implement roster sync but maintains agent rosters, provide either a periodic full roster export or incremental roster updates. This allows Darwin to maintain external-ID links and activate/deactivate agents.

2.1 Agent Roster Schema

Darwin Field NameField TypeRequiredVendor Field NameDescription
vendor_agent_idStringYes Vendor's unique, stable agent identifier. Join key for external-ID mapping.
agent_nameStringYes Full name (Last, First).
agent_emailStringYes Email address. Critical for matching and contact.
agent_phoneStringConditional E.164 format recommended.
agent_statusString (code value)Yes ACTIVE / INACTIVE / SUSPENDED. Drives activation/deactivation of rep_person records.
office_codeStringYes Office / branch code; used to disambiguate matching names.
office_nameStringConditional Office display name for reference.
license_numberStringConditional Real estate license number; aids disambiguation.
modified_dateDateTime (ISO 8601)Conditional Required on incremental exports; drives change detection. Subject to timezone declaration (Section 1.3).
linked_person_idStringConditional Darwin rep_person ID once matched; AccountTECH populates and the vendor may echo it back.

Delivery cadence:

  • Full export — all active and inactive agents; monthly or quarterly.
  • Incremental export — only agents with status or contact changes since the last pull; daily or weekly; must include modified_date.

3. Buyer / Seller Lead-Source Data

For vendors providing lead-source information (CRM systems, referral-source tracking, etc.), submit records to populate Darwin's purchasing table. These capture the source of the buyer or seller, whether the lead was office- or agent-generated, and the person's contact information.

3.1 Lead-Source Schema

Darwin Field NameField TypeRequiredVendor Field NameDescription
lead_source_record_idStringYes Vendor's unique identifier for this lead-source record; used for tracking and incremental updates.
lead_source_codeString (code value)Yes Lead-source classification. Reference the Code Value API. Examples: REFERRAL, INTERNET, DIRECT_MAIL, REPEAT_CLIENT, RELOCATION. Provide ID and string value.
lead_source_valueStringConditional Vendor's native lead-source value when it does not map to a Darwin code; AccountTECH maps it during onboarding.
is_office_generatedBooleanYes true = office-generated; false = agent-generated. Drives office vs. agent attribution.
agent_assignedObject (Agent)Conditional Agent who sourced/owns the lead (Agent Reference, Section 1.5); may differ from the transaction agent.
contact_nameStringYes Buyer/seller full name (Last, First).
contact_emailStringConditional Email; primary person-match key.
contact_phoneStringConditional Phone (E.164 recommended); secondary match key.
contact_addressObjectConditional Optional address (Section 1.4); aids person-record matching.
date_acquiredDateTime (ISO 8601)Yes When the lead was sourced. Subject to timezone declaration (Section 1.3).
modified_dateDateTime (ISO 8601)Yes Last modification; drives incremental pulls. Subject to timezone declaration (Section 1.3).

4. Code Value API Lookups

To match reliably, vendors should use the Darwin Code Value API to retrieve the actual enumeration values the client uses in our system, and return both the ID and the string value on every coded field. This avoids brittle string matching and prevents data-entry drift.

4.1 Endpoint

GET /api/v2/code-values?category={category}

Example response:

{
  "data": [
    { "id": "12345", "code": "SFR",   "description": "Single Family Residential", "active": true },
    { "id": "12346", "code": "CONDO", "description": "Condominium",              "active": true }
  ]
}

4.2 Categories to Look Up

  • property_type — SFR, CONDO, TOWNHOUSE, COMM, etc.
  • transaction_type — SALE, LEASE, EXCHANGE, SHORT_SALE, etc.
  • status — PENDING, UNDER_CONTRACT, ACTIVE, CLOSED, CANCELLED, etc. (so we know which state the property is in).
  • cancellation_reason — FINANCING_FAILED, INSPECTION_ISSUE, APPRAISAL_ISSUE, BUYER_WITHDREW, etc.
  • accounting_code — brokerage-specific accounting classifications (vary by client).
  • participant_type — TITLE_COMPANY, MORTGAGE_COMPANY, MORTGAGE_BROKER, HOME_WARRANTY, etc.
  • lead_source — REFERRAL, INTERNET, DIRECT_MAIL, REPEAT_CLIENT, RELOCATION, etc.

4.3 Recommended Practice

  1. Call the Code Value API during onboarding to retrieve all valid codes per category.
  2. Cache the values locally and refresh periodically (weekly or monthly).
  3. On every coded field, send both the Darwin ID and the string value (e.g., property_type_id: "12345", property_type: "SFR").
  4. For any value with no Darwin match, send your native value and we will map it manually during intake.

5. Data Delivery

5.1 Transport & Direction

  • REST API only. Darwin integrates exclusively over a REST API exposed by the vendor.
  • Pull only. Darwin pulls data from the vendor's API. Vendors do not push data into Darwin.

5.2 Pull Modes

The vendor API must support both of the following:

  • Full pull — returns all records. Used for initial onboarding and periodic reconciliation.
  • Incremental pull — returns only records changed since a supplied timestamp (modified_date ≥ last_pull). Cancelled transactions MUST be included so Darwin can cancel the corresponding property record rather than orphaning it.

5.3 Single-Record Retrieval

In addition to bulk pulls, the API must support retrieving a single record by a stable identifier (GUID or vendor ID) — e.g., one property/transaction at a time. This lets Darwin re-pull an individual record that was missed in a previous pull without re-running a full sync.

Open items to confirm during onboarding

  • Timezone declaration for DateTime fields (UTC vs. local — Section 1.3).
  • Per participant type: company, individual, or both (Section 1.6).
  • Whether your system separates Listing ID and Transaction ID (Section 1.1).
  • company_id / office_id routing when the client runs multiple companies in Darwin (Section 1.2).
Previous Article Payload keybox Integration
Next Article Enable the native Chrome PDF viewer