Lime CRM Integration
Sync your Lime CRM contacts and companies with Propstreet automatically.
Overview
| Feature | Support |
|---|---|
| Market | Nordic (Sweden focus) |
| Sync Direction | Bidirectional |
| Real-time Updates | Yes (customer-managed sync) |
| Contacts | ✅ Full support |
| Companies | ✅ Full support |
| Projects | ✅ Full support (v1.2.0) |
| Prospects | ✅ Full support (v1.2.0) |
| Properties | ⚠️ API available (v1.3.0) |
Data Mapping
Contact Fields (Person)
| Lime CRM | Propstreet | Notes |
|---|---|---|
| First Name | First Name | |
| Last Name | Last Name | |
| Primary email synced | ||
| Mobile Phone | Phone | Preferred phone number |
| Job Title | Job Title | Synced to company connection |
| Person↔Company | Connection | Links contact to company |
| Categories/Tags | Tags | Mapped to Propstreet tags |
| Notes | Notes/Strategy | See notes section below |
| Photo | Profile Picture | Via Lime's image API if available |
Note: Lime CRM data models vary per application. Check your Lime interactive docs at
/{application}/api/v1/docs/for exact field names.
Company Fields
| Lime CRM | Propstreet | Notes |
|---|---|---|
| Company Name | Name | |
| Organization Number | External Reference | Used for matching (Nordic markets) |
| Country | Country Code | ISO 2-letter code |
| Website | Homepage URL | If available in your Lime installation |
| — | Domain | Set directly or auto-extracted from URL |
| Company Logo | Profile Picture | Via Lime's image API if available |
How Sync Works
Lime → Propstreet
You control the sync through your own integration layer:
- Configure Lime Webhooks to send events to your middleware (e.g., Azure Logic Apps, n8n, or custom service)
- Your middleware transforms and pushes data to Propstreet via our API
- Records are matched using email or organization number and created/updated in Propstreet
This gives you full control over sync timing, filtering, and data transformation.
Propstreet → Lime
When you update a contact in Propstreet, you have two options:
Option A: Webhooks (Recommended)
- Register a Propstreet webhook for
contact.*andcompany.*events - Propstreet pushes changes to your endpoint in real-time
- Your middleware transforms and pushes to Lime CRM
Option B: Polling
- Your integration layer polls the Propstreet API for changes (using
updated_since) - Changes are transformed and pushed to Lime CRM via their API
- Your Lime records stay in sync
Webhooks provide near real-time sync without polling overhead.
Duplicate Handling
We use smart matching to prevent duplicates:
- Contacts: Matched by email address first, then Lime object ID via
externalRefs - Companies: Matched by organization number, then company name + country
If we detect a potential duplicate, we update the existing record rather than creating a new one.
Field Considerations
Application-Specific Data Models
Lime CRM allows custom data models per application. Before building your integration:
- Access your Lime interactive docs at
https://{domain}/{application}/api/v1/docs/ - Review the available limetypes (e.g.,
person,company) - Map your specific fields to Propstreet's data model
Person↔Company Relationships
Lime CRM uses relations to link persons to companies. In Propstreet:
- Each contact can have multiple company connections
- Exactly one connection must be marked as
primary - Job title is stored on the connection, not the contact
When syncing, ensure you:
- Create the company first (or find existing)
- Link the person to the company with proper relationship data
Notes vs Strategy
Propstreet has two different fields for text information:
- Strategy - Investment focus (e.g., "Office properties in Stockholm, 50-200 MSEK")
- Notes - Activity log entries (call notes, meeting summaries, etc.)
How you map Lime's note fields depends on your organization's usage:
- If notes contain investment criteria → map to
strategyfield - If notes contain call logs/activity → use the Notes API endpoint
- If mixed usage → consider keyword-based routing in your integration
Phone Numbers
Lime CRM may have multiple phone fields per person. We sync the mobile number to Propstreet; other phone numbers are not synced by default.
Profile Pictures
Lime CRM uses a separate image API for photos. If your Lime installation includes image support:
- Retrieve images via Lime's file/image API
- Upload to Propstreet using the profile picture endpoint
- Propstreet accepts standard image formats (JPEG, PNG)
Setup Requirements
To build a Lime CRM integration, you'll need:
- Lime API Access - Create a dedicated API user in Lime and generate an API key
- Propstreet API Credentials - Generate in your account settings
- Integration Layer - Middleware to handle webhooks and API calls (Azure Logic Apps, n8n, or custom)
- Lime Webhooks Add-on - Required for real-time sync from Lime (subscribe to person/company events)
Lime API Key Best Practices
- Create a dedicated API user for each external system
- API keys have no expiration date but cannot be retrieved after creation
- Store the key securely (environment variables or secret management)
- The
x-api-keyheader is used for authentication
Getting Started
- Generate Propstreet API credentials in your account settings (requires login)
- Create a dedicated API user in Lime CRM and generate an API key
- Review your Lime interactive docs at
/{application}/api/v1/docs/for available fields - Set up your integration layer to sync data between Lime and Propstreet
- If using real-time sync, configure Lime Webhooks to send events to your middleware
You're responsible for building and maintaining the integration.
Frequently Asked Questions
How do I authenticate with Lime CRM?
Lime uses API keys passed via the x-api-key header. Each user can only have one API key, so create a dedicated API user for your integration.
What are Lime's rate limits?
For Lime CRM Cloud: 3000 requests per 5 minutes per IP. Plan your sync frequency accordingly.
How do I receive real-time updates from Lime?
Use the Lime Webhooks Add-on. Subscribe to events like person.new, person.update, company.delete, etc. via the subscription API at /api/v1/subscription/.
How do I validate Lime webhook signatures?
Lime signs webhook payloads using HMAC SHA-256. The signature is in the X-Lime-Signature header as sha256=[signature]. Verify it against the raw request body using your webhook secret.
What happens if my Lime data model differs from standard?
Lime allows custom limetypes and fields per application. Access your interactive docs at /{application}/api/v1/docs/ to see your exact schema, then adjust field mappings accordingly.
How often does data sync?
Sync frequency depends on how you configure your integration layer:
- Real-time: Use Lime Webhooks + Propstreet Webhooks for immediate syncs
- Scheduled: Poll both APIs on a schedule (e.g., every 15 minutes, hourly)
- Manual: Trigger syncs on-demand
How should I handle duplicates?
Use stable cross-system IDs stored in Propstreet's externalRefs:
{
"externalRefs": [{ "namespace": "lime", "id": "12345" }]
}
Search by externalRefs first, then fall back to email or organization number matching.
Projects & Prospects (v1.2.0)
Sync real estate deals between Lime CRM Deal/Business objects and Propstreet Projects. Track investor prospects through your pipeline with bidirectional classification sync.
Note: Lime CRM data models are customizable per application. The entity may be called
dealorbusinessdepending on your installation. Check your interactive docs at/{application}/api/v1/docs/for exact field names.
Deal to Project Mapping
| Lime CRM Field | Propstreet Project | Notes |
|---|---|---|
| id | externalRefs | namespace: "lime" |
| name | name | Direct mapping |
| dealstatus | — | Use for display; see status mapping below |
| value | — | Deal value (not mapped directly) |
| company | — | Linked company reference |
| _timestamp | updatedUtc | For delta sync |
Note: Project
statusis read-only in Propstreet. It's auto-generated based on workflow state (whether teaser has been published, communicated, etc.). Use the mapping below for display purposes when syncing FROM Propstreet TO Lime.
Deal-Person Relations to Prospect Mapping
| Lime Concept | Propstreet Prospect | Notes |
|---|---|---|
| Person linked to Deal | contactId | Via Contact external ref lookup |
| Company linked to Deal | companyId | Via Company external ref lookup |
| Status on deal-person link | classification | Map to Propstreet classification |
Deal Status to Project State Mapping
Propstreet uses three separate fields for project state. Map Lime deal statuses to the appropriate combination:
Lime dealstatus (suggested) |
status |
classification |
teaser.stage |
Notes |
|---|---|---|---|---|
| contact / new | open | draft | — | Project created, not yet marketed |
| requirement | open | active | published | Teaser published |
| tender / offer | open | active | communicated | Teaser sent to investors |
| won | closed | — | — | Deal completed |
| lost | deleted | — | — | Project archived/cancelled |
status: Lifecycle state (open,closed,deleted) — read-only, set by systemclassification: Work stage (draft,active,inactive) — settable via APIteaser.stage: Teaser progress (property_added,drafting,published,verified,communicated) — read-only, set by system
Deal-Person Status to Classification Mapping
Prospect classification is read-write and settable via API. Map Lime deal-person relation status to track investor engagement:
| Lime Relation Status (typical) | Propstreet Classification | Notes |
|---|---|---|
| (not set) | not_contacted | Default state |
| contacted | contacted | Initial outreach made |
| interested | interested | Positive response |
| declined / inactive | not_interested | No longer engaged |
| bidding / agreement | bidder | Active in process |
Note: Lime's pipeline stages and relation statuses are customizable per installation. Document the mapping per customer.
Sync Architecture
Lime → Propstreet (using Webhooks):
- Subscribe to
deal.new,deal.update,deal.deleteevents (orbusiness.*depending on your installation) - Validate
X-Lime-Signatureheader (HMAC SHA-256) - Fetch full deal record via
GET /limeobject/deal/{id}/ - Transform and push to Propstreet Projects API
// Handle Lime webhook
async function handleLimeWebhook(payload) {
const dealId = payload.id;
if (payload.event === "deal.new") {
const deal = await lime.get(`/limeobject/deal/${dealId}/`);
const project = await propstreet.post("/api/v1/projects", {
name: deal.name,
externalRefs: [{ namespace: "lime", id: String(dealId) }],
});
}
}
Propstreet → Lime (using Webhooks):
- Register webhooks for
project.*andprospect.*events - Look up Lime Deal ID from
externalRefs - Update Lime via REST API
// Handle Propstreet webhook
async function handlePropstreetWebhook(payload) {
const limeId = payload.data.externalRefs?.find(
(ref) => ref.namespace === "lime"
)?.id;
if (payload.event === "project.updated" && limeId) {
await lime.put(`/limeobject/deal/${limeId}/`, {
name: payload.data.name,
});
}
}
Webhook Events
Subscribe to these Propstreet events for deal sync:
| Event | Description | Lime Action |
|---|---|---|
| project.created | New project created | Create Deal/Business |
| project.updated | Project fields modified | Update Deal |
| project.deleted | Project soft-deleted | Update dealstatus: lost |
| prospect.created | Investor added to prospect list | Add Deal-Person relation |
| prospect.updated | Classification changed | Update relation status |
| prospect.deleted | Investor deleted from prospect list | Remove Deal-Person relation |
Example: Create Project with Lime Reference
curl -X POST "https://app.propstreet.com/api/v1/projects" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Stockholm Office Building",
"externalRefs": [{ "namespace": "lime", "id": "98765" }]
}'
Example: Lookup Project by Lime ID
curl "https://app.propstreet.com/api/v1/projects/external/lime/98765" \
-H "Authorization: Bearer $TOKEN"
Lime-Specific Considerations
Schema Discovery Required:
- Field names vary per installation (
dealstatusvsstatus,dealvsbusiness) - Always check
/{application}/api/v1/docs/before building - Consider making field mappings configurable per Lime tenant
Deal-Person Junction:
- Lime may use a separate limetype (e.g.,
dealcontact,participant) for deal-person relationships - Or use direct relations on the deal/person limetypes
- Query approach varies: check if there's a
hasmanyrelation or junction table
Rate Limits:
- Lime Cloud: 3000 requests per 5 minutes per IP
- Plan initial sync carefully; use exponential backoff