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 Name | Field Type | Required | Vendor Field Name | Description | Notes |
|---|---|---|---|---|---|
| transaction_id | String (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_id | String | Yes* | 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. | |
| status | String (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_reason | String (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_date | DateTime (ISO 8601) | Conditional | Date/time the transaction was cancelled. | Required when status = CANCELLED. Subject to the timezone declaration in Section 1.3. | |
| modified_date | DateTime (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_id | String | Yes | 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_id | String | Conditional | 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_address | Object | Yes | See Property Address (Section 1.4). | Street, city, state, postal code. Used for property matching. | |
| property_type | String (code value) | Yes | Property type. | Code Value API. Examples: SFR, CONDO, TOWNHOUSE, COMM. Provide ID and string value. | |
| transaction_type | String (code value) | Yes | Transaction type. | Code Value API. Examples: SALE, LEASE, EXCHANGE. Provide ID and string value. | |
| accounting_code | String (code value) | Conditional | Accounting classification code. | Required for some brokerages. Code Value API. Provide ID and string value. | |
| mls_number | String | Conditional | MLS number. | Required if the transaction originated from an MLS. Secondary property identifier. Include board abbreviation where available. | |
| list_price | Decimal | Conditional | Original listing price (USD). | Used for financial reporting accuracy. | |
| sale_price | Decimal | Yes | Final sale / contract price (USD). | Used for commission calculations. | |
| list_side_commission | Decimal + type flag | Yes | 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_commission | Decimal + type flag | Yes | 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_agents | Array<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_agents | Array<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). | |
| participants | Array<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. | |
| referrals | Array<Referral> | No | Out-of-office referral sources to be paid out. See Referrals (Section 1.7). | Multiple referrals supported per transaction. | |
| buyer_contact | Object | Conditional | Buyer contact. See Contact Information (Section 1.8). | Include where available for lead-source matching. | |
| seller_contact | Object | Conditional | Seller contact. See Contact Information (Section 1.8). | Include where available for lead-source matching. | |
| transaction_notes | String | No | 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 Name | Field Type | Required | Vendor Field Name | Description |
|---|---|---|---|---|
| listing_date | Date (YYYY-MM-DD) | Conditional | Date the property was listed. | |
| listing_expiration_date | Date (YYYY-MM-DD) | Conditional | Date the listing agreement expires. | |
| pending_date | Date (YYYY-MM-DD) | Conditional | Date the deal went pending / under contract. | |
| estimated_close_date | Date (YYYY-MM-DD) | Conditional | Estimated closing date. |
1.4 Property Address
| Darwin Field Name | Field Type | Required | Vendor Field Name | Description |
|---|---|---|---|---|
| street_address | String | Yes | Street number and name. | |
| city | String | Yes | City or municipality. | |
| state | String | Yes | Two-letter state / province code (e.g., CA, TX). | |
| postal_code | String | Yes | ZIP / postal code (US: 5-digit or ZIP+4). | |
| country | String | No | 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 Name | Field Type | Required | Vendor Field Name | Description |
|---|---|---|---|---|
| order | Integer | Yes | Ranking within the side. 1 = primary agent, 2 = secondary, etc. | |
| split_type | String (PERCENT | AMOUNT) | Yes | Declares whether commission_split is a percentage of the side total or a dollar amount. | |
| commission_split | Decimal | Yes | This agent's share of the side's total commission. Percentages sum to 100%; amounts sum to the side total. | |
| person_guid | String (GUID) | Conditional | Darwin rep_person GUID (roster-sync vendors). Preferred identifier when available. | |
| person_id | Integer | Conditional | Darwin rep_person numeric ID (alternative to GUID). | |
| vendor_agent_id | String | Conditional | Vendor's agent ID, stored on the Darwin rep_person record for external-ID matching. | |
| agent_name | String | Yes | Full name (Last, First preferred). Used for fuzzy matching when no linked ID exists. | |
| agent_email | String | Conditional | Improves match accuracy. | |
| agent_phone | String | Conditional | E.164 format recommended. Improves match accuracy. | |
| office_code | String | Conditional | 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 Name | Field Type | Required | Vendor Field Name | Description |
|---|---|---|---|---|
| participant_type | String (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_name | String | Conditional | Organization name (required when the company is being tracked). | |
| company_id | String | Conditional | Darwin vendor ID if already set up; otherwise the vendor's own company ID. | |
| person_name | String | Conditional | Individual contact name (required when the person is being tracked). | |
| String | Conditional | Email address. MUST be paired with email_owner. | ||
| email_owner | String (COMPANY | PERSON) | Conditional | Declares whether email belongs to the company or the individual. | |
| phone | String | Conditional | Phone number (E.164 recommended). MUST be paired with phone_owner. | |
| phone_owner | String (COMPANY | PERSON) | Conditional | Declares whether phone belongs to the company or the individual. | |
| address | Object | Conditional | 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 Name | Field Type | Required | Vendor Field Name | Description |
|---|---|---|---|---|
| referral_company_name | String | Yes | Name of the referring company. | |
| referral_company_address | Object | Yes | Address of the referring company (same structure as Section 1.4). | |
| referral_company_phone | String | Yes | Phone number of the referring company (E.164 recommended). | |
| calculation_method | String (PERCENT_OF_GCI | FIXED_AMOUNT) | Yes | How the referral payout is calculated. | |
| referral_value | Decimal | Yes | The percentage of GCI, or the fixed dollar amount, per the calculation_method. |
1.8 Contact Information (Buyer / Seller)
| Darwin Field Name | Field Type | Required | Vendor Field Name | Description |
|---|---|---|---|---|
| contact_name | String | Yes | Full name (Last, First preferred). | |
| contact_email | String | Conditional | Email address. Primary key for person matching. | |
| contact_phone | String | Conditional | 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 Name | Field Type | Required | Vendor Field Name | Description |
|---|---|---|---|---|
| vendor_agent_id | String | Yes | Vendor's unique, stable agent identifier. Join key for external-ID mapping. | |
| agent_name | String | Yes | Full name (Last, First). | |
| agent_email | String | Yes | Email address. Critical for matching and contact. | |
| agent_phone | String | Conditional | E.164 format recommended. | |
| agent_status | String (code value) | Yes | ACTIVE / INACTIVE / SUSPENDED. Drives activation/deactivation of rep_person records. | |
| office_code | String | Yes | Office / branch code; used to disambiguate matching names. | |
| office_name | String | Conditional | Office display name for reference. | |
| license_number | String | Conditional | Real estate license number; aids disambiguation. | |
| modified_date | DateTime (ISO 8601) | Conditional | Required on incremental exports; drives change detection. Subject to timezone declaration (Section 1.3). | |
| linked_person_id | String | Conditional | 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 Name | Field Type | Required | Vendor Field Name | Description |
|---|---|---|---|---|
| lead_source_record_id | String | Yes | Vendor's unique identifier for this lead-source record; used for tracking and incremental updates. | |
| lead_source_code | String (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_value | String | Conditional | Vendor's native lead-source value when it does not map to a Darwin code; AccountTECH maps it during onboarding. | |
| is_office_generated | Boolean | Yes | true = office-generated; false = agent-generated. Drives office vs. agent attribution. | |
| agent_assigned | Object (Agent) | Conditional | Agent who sourced/owns the lead (Agent Reference, Section 1.5); may differ from the transaction agent. | |
| contact_name | String | Yes | Buyer/seller full name (Last, First). | |
| contact_email | String | Conditional | Email; primary person-match key. | |
| contact_phone | String | Conditional | Phone (E.164 recommended); secondary match key. | |
| contact_address | Object | Conditional | Optional address (Section 1.4); aids person-record matching. | |
| date_acquired | DateTime (ISO 8601) | Yes | When the lead was sourced. Subject to timezone declaration (Section 1.3). | |
| modified_date | DateTime (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
- Call the Code Value API during onboarding to retrieve all valid codes per category.
- Cache the values locally and refresh periodically (weekly or monthly).
- On every coded field, send both the Darwin ID and the string value (e.g.,
property_type_id: "12345", property_type: "SFR"). - 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).