The complete guide on how to integrate your VoIP solution to noCRM

1. Who is this document for?

💡 TL;DR : Product Owners and Developers

We created a smart API that lets VoIP services connect to noCRM easily, eliminating the need for complex CRM logic. Our primary goal is simplicity.

This document embodies our philosophy and serves as your comprehensive resource. It equips product owners with all the necessary information to establish a seamless connection between their VoIP service and noCRM. It also provides developers with the full documentation required to build the integration.

2. Why integrating with noCRM is easier?

💡 TL;DR : You don’t need to understand how our app works to build a great integration.

Connecting two apps is never easy, even if both sides have powerful and well-documented APIs. It often takes a significant amount of time and effort to create a seamless user experience through integration.

But, what if we told you that you don’t need to understand how noCRM works? Simply send us your data and we’ll take care of the rest.

How? We created smart endpoints that eliminate the need for you to handle the CRM's logic.

A call happened? Just send it to us!

3. What do to before building the integration?

🤝 We haven’t spoken yet? Contact us to get access to our partner API!

Our users are salespeople who rely heavily on phone calls. They want to initiate calls directly from noCRM and have them automatically logged, with easy access to recordings.

We will talk about the following in the meeting together:

  1. Overview of our tools for creating the best scenario.
  2. Providing you access to our smart endpoints by giving you your mandatory partner key.
  3. Exploring and defining our go-to-market and co-marketing opportunities.

4. How to integrate ?

⚠️ It might sound weird to read that but don’t visit our API documentation.

Everything you need is in this document. If you have any questions or if any information is missing, feel free to reach out to us at voip@youdontneedacrm.com; we are highly responsive

Authenticating

🔑 After our introduction meeting, you’ll get a partner key. This partner key must be added to all your request headers as X-API-PARTNER-KEY.
1. Connecting

Inside your app, you will provide a form that prompts users to enter two pieces of information:

  • An API key
  • Their account subdomain (each noCRM account has its subdomain, ex: acmecorp.nocrm.io)

When submitting this form, you will activate the connection by using our POST /api/v2/partners/activate endpoint

Request Try it on Postman

curl -X POST \
     -H "X-API-KEY: API_KEY_PROVIDED_BY_THE_USER" \
     -H "X-API-PARTNER-KEY: PARTNER_KEY_PROVIDED_BY_NOCRM" \
     -H "Content-Type: application/json" \
     "https://ACCOUNT_SUBDOMAIN.nocrm.io/api/v2/partners/activate"

Expected JSON response

{
    "valid_api_key": true,
    "valid_partner_key": true,
    "activated": true
}
2. Revoking

Once the connection has been made, you will provide a button to revoke it. When the user revokes the connection, you will use our POST /api/v2/partners/revoke endpoint.

Request Try it on Postman

curl -X POST \
     -H "X-API-KEY: API_KEY_PROVIDED_BY_THE_USER" \
     -H "X-API-PARTNER-KEY: PARTNER_KEY_PROVIDED_BY_NOCRM" \
     -H "Content-Type: application/json" \
     "https://ACCOUNT_SUBDOMAIN.nocrm.io/api/v2/partners/revoke"

Expected JSON response

{
    "valid_api_key": true,
    "valid_partner_key": true,
    "activated": false
}

Logging calls

ℹ️ 1 simple rule: No logic. No conditions. When a call has ended, send it to noCRM.

We created a smart endpoint that will handle all the logic. You don’t have to worry about which deal, contact or client to attach the call to. Just send it to us. If you are writing code that does anything other than send the call to noCRM, you’re doing it wrong!

Send the call using our POST /api/v2/calls endpoint.

Request Try it on Postman

curl -X POST \
     -H "X-API-KEY: API_KEY_PROVIDED_BY_THE_USER" \
     -H "X-API-PARTNER-KEY: PARTNER_KEY_PROVIDED_BY_NOCRM" \
     -H "Content-Type: application/json" \
     "https://ACCOUNT_SUBDOMAIN.nocrm.io/api/v2/calls"
             
ParameterInfoDescription
called_numberrequired *The phone number called. Required for outbound calls. Use international format only. Ex: +33123456789 or 0033123456789.
from_numberrequired *The phone number who initiated the call. Required for inbound calls. Use international format only. Ex: +33123456789 or 0033123456789.
directionrequiredMust be inbound or outbound
user_idrequiredUser’s email address or id to whom the call should belong.
missed_callrequiredCan be set to true or false. Set it to true when the call was not answered. The appropriate activity will be selected (answered/unanswered). If the call is an inbound call, it can be discarded or a notification can be created (please check your phone settings : https://ACCOUNT_SUBDOMAIN.nocrm.io/admin/account/voip_setup)
voicemailoptionalCan be set to true or false when a voicemail is reached. It should match the missed_call parameter
started_atoptionalDate and time of the start of the call. Use UTC with this specific format: YYYY-MM-DDTHH:MM:SS.sssZ. Warning : started_at < ended_at
ended_atoptionalDate and time of the end of the call. Use UTC with this specific format: YYYY-MM-DDTHH:MM:SS.sssZ. Warning : ended_at > started_at
record_linkoptionalLink to the record
ext_call_keyoptionalThe call's ID on your system
commentoptionalA text that the customer could fill up to have feedback on the call and might add insight regarding the call
item_idoptionalnoCRM’s id of the item to attach the call to (must come with item_type)
item_typeoptionalnoCRM’s type of the item to attach the call to (must come with item_id), possible values : Lead or Prospect

Expected JSON response

{
    "id": 3547599,
    "ext_call_key": "YOUR_CALL_ID",
    "ext_text_key": null,
    "provider": "VoIP Partner Name",
    "direction": "outbound",
    "called_number": "245-765-3498",
    "to_number": "245-765-3498",
    "from_number": "333 444 5555",
    "record_link": "https://voip-call.com/record-link/235532344423",
    "started_at": "2023-11-13T09:12:00.000Z",
    "ended_at": "2023-11-13T09:34:12.000Z",
    "sent_at": null,
    "duration": 1332,
    "created_at": "2023-11-13T22:11:04.000Z",
    "kind": "call",
    "is_voicemail": false,
    "user": {
        "id": 217658,
        "lastname": "noCRM",
        "firstname": "User",
        "email": "user-nocrm@example.com",
        "phone": "",
        "mobile_phone": ""
    },
    "called_item": {
        "item": "Lead",
        "id": 26325240
    },
    "texted_item": null,
    "comment": {
        "id": 81842072,
        "content": "The call was really interesting with a lot of good questions. Need to send more information about the project.",
        "activity_id": 88877,
        "is_pinned": false
    },
    "text_content": null
}

Logging texts

ℹ️ 1 simple rule: No logic. No conditions. When a text message is sent or received, send it to noCRM.

Similar to what we've implemented for calls, we created a smart endpoint that will handle all the logic. You don’t have to worry about which deal, contact or client to attach the message to. Just send it to us. If you are writing code that does anything other than send the text to noCRM, you’re doing it wrong!

Send the text using our POST /api/v2/texts endpoint.

Request Try it on Postman

curl -X POST \
     -H "X-API-KEY: API_KEY_PROVIDED_BY_THE_USER" \
     -H "X-API-PARTNER-KEY: PARTNER_KEY_PROVIDED_BY_NOCRM" \
     -H "Content-Type: application/json" \
     "https://ACCOUNT_SUBDOMAIN.nocrm.io/api/v2/texts"
             
ParameterInfoDescription
to_numberrequiredThe phone number texted. This parameter is required in case of text sent. Use international format only. Ex: +33123456789 or 0033123456789.
from_numberrequiredThe phone number who initiated the text. This parameter is required in case of text message received. Use international format only. Ex: +33123456789 or 0033123456789.
directionrequiredMust be inbound or outbound
user_idrequiredUser’s email address or id to whom the text should belong.
sent_atoptionalDate and time of the text message (sent or received). Use UTC with this specific format: YYYY-MM-DDTHH:MM:SS.sssZ.
ext_text_keyoptionalThe text's ID on your system
contentoptionalThe content of the text message
item_idoptionalnoCRM’s id of the item to attach the call to (must come with item_type)
item_typeoptionalnoCRM’s type of the item to attach the call to (must come with item_id), possible values : Lead or Prospect

Expected JSON response

{
    "id": 3547601,
    "ext_call_key": "YOUR_TEXT_ID",
    "ext_text_key": "YOUR_TEXT_ID",
    "provider": "VoIP Partner Name",
    "direction": "outbound",
    "called_number": "245-765-3498",
    "to_number": "245-765-3498",
    "from_number": "333 444 5555",
    "record_link": null,
    "started_at": null,
    "ended_at": null,
    "sent_at": "2023-11-13T09:12:00.000Z",
    "duration": 0,
    "created_at": "2023-11-13T22:17:06.000Z",
    "kind": "text",
    "is_voicemail": false,
    "user": {
        "id": 217658,
        "lastname": "noCRM",
        "firstname": "User",
        "email": "user-nocrm@example.com",
        "phone": "",
        "mobile_phone": ""
    },
    "called_item": {
        "item": "Lead",
        "id": 26325240
    },
    "texted_item": {
        "item": "Lead",
        "id": 26325240
    },
    "comment": {
        "id": 81842295,
        "content": null,
        "activity_id": 534647,
        "is_pinned": false
    },
    "text_content": "Hey, I just sent you back the invoice. Please review it."
}

Displaying contact information from noCRM in your app

When a user makes or receives a call, you can request contact information from noCRM. This information can be useful for:

  • Providing the user with information and context about who they are talking to when an inbound call is happening
  • Storing contact information to display it in your call logs

In noCRM you can find contact information on prospects and/or leads. Once again, to simplify your work, we’ve created a single endpoint for you to get the most relevant data.

Get contact information using our GET /api/v2/calls/get_contact endpoint.

Request Try it on Postman

curl -H "X-API-KEY: API_KEY_PROVIDED_BY_THE_USER" \
     -H "X-API-PARTNER-KEY: PARTNER_KEY_PROVIDED_BY_NOCRM" \
     -H "Content-Type: application/json" \
     "https://ACCOUNT_SUBDOMAIN.nocrm.io/api/v2/calls/get_contact?user_id=user-nocrm@example.com&phone=245-765-3498"
             
ParameterInfoDescription
phonerequiredThe phone number of caller for an inbound call, or the callee for a outbound call. Use international format only. Ex: +33123456789 or 0033123456789.
user_idrequiredThe email address or the user ID of the user getting or passing the phone call.

Expected JSON response

{
    "id": 26325240,
    "title": "VoIP Doc Lead",
    "contact_type": "Lead",
    "status": "todo",
    "permalink": "https://ACCOUNT_SUBDOMAIN.nocrm.io/leads/26325243",
    "fields": [
        { "name": "First name", "type": "first_name", "value": "Jane" },
        { "name": "Last name", "type": "last_name", "value": "Doe" },
        { "name": "Phone", "type": "mobile", "value": "245-765-3498" },
        { "name": "Email", "type": "email", "value": "jdoe.voip@example.com" }
    ]
}

Updating comments on existing calls

⚠️ This feature only works if you provide us with your call ID's, see EXT_CALL_KEY in Logging calls.

It's common to see a note or comment feature in VoIP systems. But the user does not always use it during the call.

If the user submits a comment after the call has been sent to noCRM, you can easily add it to the call using our PUT /api/v2/calls/{EXT_CALL_KEY}/update_comment endpoint.

Request Try it on Postman

curl -X PUT \
     -H "X-API-KEY: API_KEY_PROVIDED_BY_THE_USER" \
     -H "X-API-PARTNER-KEY: PARTNER_KEY_PROVIDED_BY_NOCRM" \
     -H "Content-Type: application/json" \
     "https://ACCOUNT_SUBDOMAIN.nocrm.io/api/v2/calls/EXT_CALL_KEY/update_comment"
              
ParameterInfoDescription
ext_call_keyrequiredThe identifier of the your call object.
contentrequiredThe new comment to set (note that any existing content will be replaced by this value).

Expected JSON response

{
    "id": 81842010,
    "content": "My updated comment",
    "commented_item": {
        "item": "Lead",
        "id": 26325240
    },
    "created_at": "2023-11-13T22:09:37.000Z",
    "attachments": [],
    "activity_id": 88877,
    "is_pinned": false,
    "raw_content": "My updated comment",
    "extended_info": {
        "provider": "VoIP Partner Name",
        "direction": "outbound",
        "record_link": "https://voip-call.com/record-link/235532344423",
        "duration": 1332.0
    },
    "reactions": [],
    "user": {
        "id": 217658,
        "lastname": "noCRM",
        "firstname": "User",
        "email": "user-nocrm@example.com",
        "phone": "",
        "mobile_phone": ""
    },
    "activity": {
        "id": 88877,
        "name": "Answered",
        "kind": "call",
        "duration": null,
        "icon": "phone",
        "color": "#28a745",
        "created_at": "2017-12-20T10:01:08.000Z",
        "is_outcome": true
    },
    "action_item": {
        "type": "call",
        "call": {
            "id": 3547597,
            "ext_call_key": "YOUR_CALL_ID",
            "ext_text_key": null,
            "provider": "VoIP Partner Name",
            "direction": "outbound",
            "called_number": "245-765-3498",
            "to_number": "245-765-3498",
            "from_number": "333 444 5555",
            "record_link": "https://voip-call.com/record-link/235532344423",
            "started_at": "2023-11-13T09:12:00.000Z",
            "ended_at": "2023-11-13T09:34:12.000Z",
            "sent_at": null,
            "duration": 1332.0,
            "created_at": "2023-11-13T22:09:37.000Z",
            "kind": "call",
            "is_voicemail": false,
            "user": {
                "id": 217658,
                "lastname": "noCRM",
                "firstname": "User",
                "email": "user-nocrm@example.com",
                "phone": "",
                "mobile_phone": ""
            },
            "called_item": {
                "item": "Lead",
                "id": 26325240
            },
            "texted_item": null,
            "comment": {
                "id": 81842010,
                "content": "My updated comment",
                "activity_id": 88877,
                "is_pinned": false
            },
            "text_content": null
        }
    }
}

5. Before going live : How to review your integration?

☝️ We’ve summarized the key points to review before going live with the integration.
Connection (mandatory)
Call logging (mandatory)

Quick test!

  1. On noCRM, create a lead with a specific phone number
  2. Use your dialer to call that number
  3. When the call is over, check that the call is properly attached to the noCRM lead or prospect

    The call should appear as shown below:

    Outbound call
    Inbound call
Text (SMS) logging (optional)

Each time a SMS is sent or received, the message must be sent to noCRM through the POST /api/v2/texts endpoint. There should be no CRM logic on your side, we’ll manage the text.

A text message should appear as shown below:

Outbound text
Inbound text
Displaying contact information from noCRM (optional)

When your user receives a call, you can ask noCRM for information related to the phone number of your caller, to display it in your app or dialer. A simple request to GET /api/v2/calls/get_contact will get you the information.

Click-to-call from noCRM (highly recommended)

Allowing noCRM users to start a call directly from noCRM is key for a smooth user experience. If you provide a link to start a call or pre-fill your app’s dialer with a phone number, we will integrate it to noCRM and the click-to-call feature will automatically be set up when the user connects their noCRM account to your VoIP app.