Home Services For Developers Docs Pricing
Sign In Get Started
DealsFlow Developer API

Send app activity into DealsFlow. Run the business layer after.

DealsFlow sits after app activity. Your app sends users, lifecycle events, products or services, sales or orders, support conversations, support messages, and bookings. Flow uses that ingest for onboarding, segmentation, support and inbox workflows, follow-up automation, CRM context, booking workflows, and product-aware and revenue-aware operations.

Base URLhttps://app.dealsflow.ai AuthBearer API key Scopeorg-scoped keys
integration-map.http Live surface
GET  https://app.dealsflow.ai/api/developer/health/
GET  https://app.dealsflow.ai/api/developer/me/

POST https://app.dealsflow.ai/api/developer/users/upsert/
POST https://app.dealsflow.ai/api/developer/events/
POST https://app.dealsflow.ai/api/developer/products/upsert/
POST https://app.dealsflow.ai/api/developer/sales/upsert/
POST https://app.dealsflow.ai/api/developer/conversations/upsert/
POST https://app.dealsflow.ai/api/developer/messages/upsert/
POST https://app.dealsflow.ai/api/developer/bookings/upsert/

Authorization: Bearer YOUR_API_KEY

DealsFlow becomes the business workflow layer after app activity.

Most teams already have the product data. The missing piece is the operational layer around it. DealsFlow ingests the activity your app already knows about, then uses that data to run onboarding, segmentation, support context, follow-up automation, CRM memory, booking workflows, and revenue-aware operations without forcing you to rebuild those systems inside your product.

Common integration patterns
  • Import new app users after registration.
  • Track installs, opens, subscriptions, and purchases.
  • Sync products or services from the app catalog.
  • Sync orders and sales so Flow can reason over customers and revenue events.
  • Sync in-app support conversations and messages so support operations live in one place.
  • Sync demos, calls, or consultations booked from inside the app.
  • Let Flow identify inactive users, draft outreach, summarize support threads, and manage follow-up workflows.

The natural objects your app sends into DealsFlow

The core ingest model is straightforward: users, lifecycle and product events, products or services, sales or orders, support conversations, support messages, and bookings. Those are the objects Flow can use to build operational context around the app.

USR

Users

Imported app users become the canonical CRM client record that follow-up, support, bookings, and sales context attach to.

EVT

Lifecycle and product events

Use events for installs, opens, subscriptions, purchases, and other signals that describe what just happened in the app.

PRD

Products or services

Sync the catalog your app actually sells so Flow can reason about what the user bought, booked, or asked about.

SAL

Sales or orders

Attach buyers and products to revenue events so follow-up can use customer and transaction context together.

CON

Support conversations

Bring imported threads into DealsFlow inbox context so support workflows have the same customer record and product context.

MSG

Support messages

Append or update the messages inside imported conversations so thread history stays operational inside Flow.

BKG

Bookings

Sync demos, calls, consultations, appointments, and similar bookings with the right client and service context.

{
  "external_user_id": "usr_123",
  "email": "user@example.com",
  "name": "John Doe",
  "created_at": "2026-03-23T10:30:00Z",
  "plan": "pro",
  "status": "active",
  "subscription_status": "active",
  "billing_model": "subscription",
  "billing_interval": "month",
  "installed_at": "2026-03-23T10:30:00Z",
  "install_platform": "ios",
  "install_source": "producthunt",
  "app_version": "1.4.2",
  "metadata": {
    "source": "producthunt",
    "company": "Acme Labs"
  }
}
{
  "event": "app_installed",
  "user": {
    "external_user_id": "usr_123",
    "email": "user@example.com",
    "name": "John Doe"
  },
  "properties": {
    "install_platform": "ios",
    "install_source": "producthunt",
    "app_version": "1.4.2"
  },
  "event_timestamp": "2026-03-23T10:30:00Z"
}
{
  "external_product_id": "prod_roman_pro",
  "sku": "ROMAN-PRO",
  "title": "Roman Pro",
  "type": "product",
  "description": "Training app for modern athletes.",
  "short_description": "Roman mobile training",
  "currency": "USD",
  "price": "29.00",
  "sale_price": "19.00",
  "is_active": true
}

{
  "sale_id": "order_1001",
  "date": "2026-03-23T16:45:00Z",
  "quantity": 2,
  "total": "58.00",
  "buyer": {
    "external_user_id": "usr_123",
    "email": "user@example.com",
    "name": "John Doe"
  },
  "product": {
    "external_product_id": "prod_roman_pro",
    "sku": "ROMAN-PRO",
    "title": "Roman Pro",
    "currency": "USD",
    "price": "29.00"
  }
}
{
  "thread_id": "conv_support_1001",
  "last_message_at": "2026-03-24T09:00:00Z",
  "channel": {
    "external_channel_id": "app_support_main",
    "display_name": "In-App Support",
    "type": "app_inbox"
  },
  "contact": {
    "external_user_id": "usr_123",
    "email": "user@example.com",
    "name": "John Doe",
    "phone": "+15551234567"
  },
  "metadata": {
    "topic": "billing",
    "plan": "pro"
  }
}

{
  "message_id": "msg_support_1001",
  "thread_id": "conv_support_1001",
  "direction": "in",
  "text": "I need help with my billing screen.",
  "sent_at": "2026-03-24T09:15:00Z",
  "delivery_status": "read",
  "channel": {
    "external_channel_id": "app_support_main",
    "display_name": "In-App Support",
    "type": "app_inbox"
  },
  "contact": {
    "external_user_id": "usr_123",
    "email": "user@example.com",
    "name": "John Doe"
  },
  "metadata": {
    "screen": "billing_modal",
    "device": "ios"
  }
}
{
  "booking_id": "booking_1001",
  "title": "Roman onboarding call",
  "booking_type": "video_call",
  "status": "confirmed",
  "scheduled_at": "2026-03-25T10:30:00Z",
  "duration_minutes": 45,
  "location": "Google Meet",
  "notes": "Booked from inside the mobile app.",
  "client": {
    "external_user_id": "usr_123",
    "email": "user@example.com",
    "name": "John Doe"
  },
  "service_external_ids": ["svc_onboarding"]
}
Users

Supported user fields

external_user_idemailnamecreated_atplanstatussubscription_statusbilling_modelbilling_intervalsubscription_started_atsubscription_ends_atinstalled_atlast_opened_atuninstalled_atinstall_platforminstall_sourceapp_versioninstall_countis_installednext_billing_atlast_payment_atlast_payment_amountlast_payment_currencylifetime_valuetotal_payments_countis_active_customermetadata
Events

Supported event fields

eventuserpropertiesevent_timestampIdempotency-Key
Common event examples: user_signed_up, user_purchased, subscription_started, subscription_renewed, app_installed, app_opened, app_uninstalled.
Products or services

Supported product and service fields

external_product_idskutitletypedescriptionshort_descriptioncurrencypricesale_pricecost_priceapprox_duration_minutesis_active
Sales or orders

Supported sale and order fields

sale_iddatequantitytotalbuyerproduct
Support conversations

Supported conversation fields

thread_idlast_message_atchannelcontactmetadata
Support messages

Supported message fields

message_idthread_iddirectiontextmediasent_atdelivery_statusmetadata
Bookings

Supported booking fields

booking_idtitlebooking_typestatusscheduled_atduration_minuteslocationnotesclientservice_external_idsservices

The implemented Developer API surface

All requests are made against https://app.dealsflow.ai with a Bearer API key from DealsFlow Settings > Developer API. Keys are org-scoped. The endpoint surface is intentionally compact: send the business objects your app already owns, then let Flow operate on that context.

Read model Use GET /api/developer/health/ to check API reachability and current API version. Use GET /api/developer/me/ to confirm the authenticated organization and return key metadata for the current API key.
GET/api/developer/health/

Checks API reachability and returns the current API version.

GET/api/developer/me/

Confirms the authenticated organization and returns key metadata for the current API key.

POST/api/developer/users/upsert/

Creates or updates an imported app user.

  • Syncs a canonical CRM client.
  • Updates attached app profile context when app-specific fields are present.
POST/api/developer/events/

Ingests lifecycle and product events for app activity, installs, subscriptions, purchases, and similar signals.

  • Supports idempotency with the Idempotency-Key header.
  • Use it for events such as app_installed, app_opened, and revenue or subscription signals.
POST/api/developer/products/upsert/

Creates or updates imported products or services.

POST/api/developer/sales/upsert/

Creates or updates imported sales and orders.

  • Can attach buyer and product in the same request.
  • Useful when Flow needs both customer and revenue context together.
POST/api/developer/conversations/upsert/

Creates or updates imported support conversations and threads.

  • Places the thread into DealsFlow inbox context.
  • Keeps support workflows attached to the same customer record used elsewhere in Flow.
POST/api/developer/messages/upsert/

Creates or updates imported support messages.

  • Appends or updates messages inside imported conversations.
  • Lets Flow reason over thread history, not just the last event.
POST/api/developer/bookings/upsert/

Creates or updates demos, calls, consultations, appointments, and similar bookings.

  • Attaches the booking to the right client.
  • Can attach imported services with service_external_ids or services.

Real curl requests for the public API

These examples use the implemented surface above. Authentication is always Bearer auth, keys are org-scoped, and event ingest supports Idempotency-Key when you need safe retries.

POST /api/developer/events/

Events
curl -X POST "https://app.dealsflow.ai/api/developer/events/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: evt-usr_123-app_installed-20260323T103000Z" \
  -d '{
    "event": "app_installed",
    "user": {
      "external_user_id": "usr_123",
      "email": "user@example.com",
      "name": "John Doe"
    },
    "properties": {
      "install_platform": "ios",
      "install_source": "producthunt",
      "app_version": "1.4.2"
    },
    "event_timestamp": "2026-03-23T10:30:00Z"
  }'

POST /api/developer/users/upsert/

Users
curl -X POST "https://app.dealsflow.ai/api/developer/users/upsert/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "external_user_id": "usr_123",
    "email": "user@example.com",
    "name": "John Doe",
    "created_at": "2026-03-23T10:30:00Z",
    "plan": "pro",
    "status": "active",
    "subscription_status": "active",
    "billing_model": "subscription",
    "billing_interval": "month",
    "installed_at": "2026-03-23T10:30:00Z",
    "install_platform": "ios",
    "install_source": "producthunt",
    "app_version": "1.4.2",
    "metadata": {
      "source": "producthunt",
      "company": "Acme Labs"
    }
  }'

POST /api/developer/messages/upsert/

Support
curl -X POST "https://app.dealsflow.ai/api/developer/messages/upsert/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "message_id": "msg_support_1001",
    "thread_id": "conv_support_1001",
    "direction": "in",
    "text": "I need help with my billing screen.",
    "sent_at": "2026-03-24T09:15:00Z",
    "delivery_status": "read",
    "channel": {
      "external_channel_id": "app_support_main",
      "display_name": "In-App Support",
      "type": "app_inbox"
    },
    "contact": {
      "external_user_id": "usr_123",
      "email": "user@example.com",
      "name": "John Doe"
    },
    "metadata": {
      "screen": "billing_modal",
      "device": "ios"
    }
  }'

POST /api/developer/bookings/upsert/

Bookings
curl -X POST "https://app.dealsflow.ai/api/developer/bookings/upsert/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "booking_id": "booking_1001",
    "title": "Roman onboarding call",
    "booking_type": "video_call",
    "status": "confirmed",
    "scheduled_at": "2026-03-25T10:30:00Z",
    "duration_minutes": 45,
    "location": "Google Meet",
    "notes": "Booked from inside the mobile app.",
    "client": {
      "external_user_id": "usr_123",
      "email": "user@example.com",
      "name": "John Doe"
    },
    "service_external_ids": ["svc_onboarding"]
  }'

Operational context around the app, not just another raw database

Once the app data is ingested, Flow can act on it. That means segmentation by behavior, support workflows in inbox context, follow-up driven by product and sales state, and booking workflows that understand who booked, what they booked, and what should happen next.

Segment users by behavior

Use installs, opens, subscriptions, purchases, and status fields to group users by lifecycle stage, activity, revenue state, or source.

Act on support conversations in inbox context

Imported conversations and messages land in DealsFlow inbox context so support operations can use the same customer, product, and thread history together.

Use product and sales context for follow-up

Products, services, and orders let Flow draft follow-up based on what the user bought, what they asked about, and what revenue state they are in.

Use bookings for reminders and post-booking workflows

Bookings can trigger reminders, handoff preparation, and post-booking follow-up tied to the same client and service context.

What this makes possible
  • Identify inactive users from lifecycle signals.
  • Draft outreach with product-aware and revenue-aware context.
  • Summarize support threads from imported conversations and messages.
  • Manage follow-up workflows after purchases, support activity, and bookings.
Result

DealsFlow becomes operational context around the app, not just a raw database.

Auth model, reachability checks, and documented error codes

Authentication
  • Base API URL: https://app.dealsflow.ai
  • Authentication: Bearer API key from DealsFlow Settings > Developer API
  • Keys are org-scoped
  • Use Authorization: Bearer YOUR_API_KEY on every request
Sanity checks
  • GET /api/developer/health/ checks reachability and returns the current API version.
  • GET /api/developer/me/ confirms the authenticated organization and current key metadata.
  • Use the Idempotency-Key header on POST /api/developer/events/ when retrying event ingestion.
Documented errors
401
missing_authorization

Authorization header is missing.

401
invalid_api_key

Bearer key is invalid for the organization or no longer usable.

400
invalid_json

Request body is not valid JSON.

400
missing_user_identity

User upsert or nested user data is missing its required identity.

400
missing_sale_identity

Sale or order upsert is missing its required sale identifier.

400
missing_thread_identity

Conversation upsert is missing its required thread identifier.

400
missing_message_identity

Message upsert is missing its required message identifier.

400
missing_booking_identity

Booking upsert is missing its required booking identifier.

400
missing_booking_scheduled_at

Booking upsert is missing scheduled_at.

429
rate_limited

Retry later and back off before sending the next request burst.

Send the data your app already has. Let Flow operate on it.

Connect registration, lifecycle, catalog, revenue, support, and booking data once. Then use DealsFlow as the workflow layer for onboarding, segmentation, inbox operations, follow-up, CRM context, and post-booking work.