NAV Navbar
Logo
Java Ruby Go PHP Python Rust

Введение

Спасибо за выбор Synergy CRM! Данный API позволяет работать со всеми основными объектами и настройками SynergyCRM, благодаря чему вы можете быстро создавать свои собственные приложения. В случае возникновения вопросов по работе API обращайтесь в техническую поддержку.

Получение API токена

Для корректной работы всех последующих примеров вам потребуется ключ для доступа к SynergyCRM API. Чтобы получить данный ключ перейдите в раздел Настройки / Настройки API из своего аккаунта. Детали можно посмотреть в инструкции по ссылке.

Спецификация

Форматы запросов и ответов к API соответствуют спецификации JSON API v1.0.

Постраничный вывод (пагинация)

Пример ответа, содержащего метаданные о количестве объектов и количество страниц

    {
      "data" : [....],
      "meta": {
        "record-count": 2222,
        "page-count": 22
      }
    }

Для перехода на вторую (третью, четвертую и тд) страницу, необходимо в адрес запроса указывать параметр page[number], например, чтобы получить вторую страницу сделок нужно GET запрос отправлять на адрес https://app.syncrm.ru/api/v1/deals?page[number]=2.

Для изменения количества выводимых объектов на страницу нужно использовать параметр page[size], по умолчанию размер страницы составляет 50 объектов, максимально допустимый 100 объектов. GET запрос на адрес https://app.syncrm.ru/api/v1/deals?page[size]=5 вернет 5 сделок.

Оба параметра page[number] и page[size] можно вызывать вместе, GET запрос на адрес https://app.syncrm.ru/api/v1/deals?page[number]=2&page[size]=2 вернет две сделки второй страницы.

Каждый ответ содержит не только ключ c данными (data), но и ключ с метаданными (meta), в котором хранится информация о общем количестве объектов (record-count) запрашиваемой сущности и о общем количестве страниц (page-count).

Таким образом, на основании метаданных, можно строить логику деления объектов на страницы.

Авторизация

Чтобы авторизоваться используйте следующий код

curl "https://app.syncrm.ru/api/v1/deals" \
  -H "Authorization: Bearer api_token"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deals");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deals')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/deals", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deals');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/deals', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/deals")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}

Используйте полученный в настройках API токен вместо api_token

Каждый запрос к API требует авторизации. Для авторизации необходим специальный уникальный токен.

Токен авторизации необходимо передавать в заголовке Authorization каждого запроса. Пример:

Authorization: Bearer access_api_token

Контакты

Создание контакта с предустановленным источником и ответственным

curl "https://app.syncrm.ru/api/v1/contacts" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"contacts",
         "attributes":{
           "first-name":"Иван",
           "last-name":"Иванов"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           },
           "responsible":{
             "data":{
               "type":"users",
               "id":"2"
             }
           }
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/contacts");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"contacts\",\"attributes\":{\"first-name\":\"Иван\",\"last-name\":\"Иванов\"},\"relationships\":{\"source\":{\"data\":{\"type\":\"sources\",\"id\":\"2\"}},\"responsible\":{\"data\":{\"type\":\"users\",\"id\":\"2\"}}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/contacts')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"contacts",
         "attributes":{
           "first-name":"Иван",
           "last-name":"Иванов"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           },
           "responsible":{
             "data":{
               "type":"users",
               "id":"2"
             }
           }
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"contacts",
         "attributes":{
           "first-name":"Иван",
           "last-name":"Иванов"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           },
           "responsible":{
             "data":{
               "type":"users",
               "id":"2"
             }
           }
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/contacts", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/contacts');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"contacts",
         "attributes":{
           "first-name":"Иван",
           "last-name":"Иванов"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           },
           "responsible":{
             "data":{
               "type":"users",
               "id":"2"
             }
           }
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"contacts",
         "attributes":{
           "first-name":"Иван",
           "last-name":"Иванов"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           },
           "responsible":{
             "data":{
               "type":"users",
               "id":"2"
             }
           }
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/contacts', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/contacts")
        .headers(headers)
        .body("{\"data\":{\"type\":\"contacts\",\"attributes\":{\"first-name\":\"Иван\",\"last-name\":\"Иванов\"},\"relationships\":{\"source\":{\"data\":{\"type\":\"sources\",\"id\":\"2\"}},\"responsible\":{\"data\":{\"type\":\"users\",\"id\":\"2\"}}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type contacts
URL /api/v1/contacts
Список GET /api/v1/contacts
Чтение GET /api/v1/contacts/{id}
Создание POST /api/v1/contacts
Редактирование PATCH /api/v1/contacts/{id}
Удаление DELETE /api/v1/contacts/{id}

Атрибуты

Ниже приведен пример формата данных, в реальном ответе будут присутствовать все перечисленные атрибуты

{
  "data": {
      "type":"contacts",
      "id":"2",
      "attributes":{
        "first-name":"Иван",
        "last-name":"Иванов",
        "work-phone":"+79876543211",
        "customs":{
          "custom-1":"Значение",
          "custom-943":"2022-02-22T12:02:22.222+03:00"
        },
        "created-at":"2022-02-22T12:02:22.222+03:00",
        "updated-at":"2022-02-22T12:02:22.222+03:00",
        "archived-at":null
      }
   }
}

Основные атрибуты

Имя Тип Пример Запись Описание
first-name* string Иван да Имя
last-name* string Иванов да Фамилия
middle-name string Иванович да Отчество
description string Описание да Описание
general-phone string +79876543211 да Телефон (основной)
mobile-phone string +79876543211 да Телефон (мобильный)
work-phone string +79876543211 да Телефон (рабочий)
work-phone-postfix string 200 да Добавочный (рабочий)
other-phone string +79876543211 да Телефон (дополнительный)
other-phone-postfix string 200 да Добавочный (дополнительный)
fax string +79876543211 да Факс
email string help@syncrm.ru да E-mail адрес
other-email string help@syncrm.ru да E-mail адрес (дополнительный)
website string syncrm.ru да Сайт
custom hash {"custom-1":'custom value'} да Свои поля
created-at datetime 2022-02-22T12:02:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:02:22.222+03:00 нет Дата обновления
archived-at datetime 2022-02-22T12:02:22.222+03:00 да Дата архивации

* Обязательные поля

Рабочий адрес

Имя Тип Пример Запись Описание
work-country string Россия да Страна
work-region string Республика Татарстан да Область, регион, край
work-city string Иннополис да Город, населенный пункт
work-zipcode string 012345 да Индекс
work-street string ул. Университетская да Улица, проспект
work-building string 22а да Номер дома
work-housing string 2 да Корпус
work-apartment string 123 да Номер офиса или квартиры

Домашний адрес

Имя Тип Пример Запись Описание
home-country string Россия да Страна
home-region string Москва да Область, регион, край
home-city string Москва да Город, населенный пункт
home-zipcode string 012345 да Индекс
home-street string ул. Кремлевская да Улица, проспект
home-building string 22а да Номер дома
home-housing string 2 да Корпус
home-apartment string 123 да Номер офиса или квартиры

Соц. сети и мессенджеры

Имя Тип Пример Запись Описание
vkontakte string vk.com/domain да ВКонтакте
facebook string facebook.com/domain да Facebook
linkedin string ru.linkedin.com/domain да Linked-in
odnoklassniki string ok.ru/domain да Одноклассники
instagram string instagram.com/domain да Instagram
twitter string twitter.com/domain да Twitter
whatsapp string wa.me/79876543211 да WhatsApp
viber string viber://chat?number=+79876543211 да Viber
telegram string t.me/username да Telegram
skype string skype:(username) да Skype

Связи

Пример данных (перечислены не все связи)

{
  "data": {
      "type":"contacts",
      "id":"2",
      "relationships":{
        "responsible":{
          "links":{
            "self":"/api/v1/contacts/2/relationships/responsible",
            "related":"/api/v1/contacts/2/responsible"
          }
        },
        "contact-type":{
          "links":{
            "self":"/api/v1/contacts/2/relationships/contact-type",
            "related":"/api/v1/contacts/2/contact-type"
          }
        }
      }
   }
}

Пример запроса с загруженными отвественными и типом контакта

curl "https://app.syncrm.ru/api/v1/contacts?include=responsible,contact-type" \
  -H "Authorization: Bearer api_token"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/contacts?include=responsible,contact-type");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/contacts?include=responsible,contact-type')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/contacts?include=responsible,contact-type", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/contacts?include=responsible,contact-type');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/contacts?include=responsible,contact-type', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/contacts?include=responsible,contact-type")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}

Каждая связь может быть включена в JSON ответ через параметр include, согласно официальной спецификации JSON API Inclusion of Related Resources.

Название Связь JSON API type
Ответственный responsible users
Создатель user users
Источник source sources
Компании companies companies
Статус status contact-statuses
Тип contact-type contact-types
Сделки deals deals
Заявки orders orders
Продукты products products
Спецификации entities-products entity-products
Задачи tasks diary-tasks
События events diary-events

Фильтры

Получить список контактов с определённым рабочим номером

curl -G "https://app.syncrm.ru/api/v1/contacts" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[work_phone]=+79876543211"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/contacts?filter[work_phone]=79876543211");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/contacts?filter[work_phone]=79876543211')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/contacts?filter[work_phone]=79876543211", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/contacts?filter[work_phone]=79876543211');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/contacts?filter[work_phone]=79876543211', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/contacts?filter[work_phone]=79876543211")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
last-name Вывести контакты по определенному last-name filter[last-name]=Ivanov
first-name Вывести контакты по определенному first-name filter[first-name]=Ivan
middle-name Вывести контакты по определенному middle-name filter[middle-name]=Ivanovich
work-phone Вывести контакты по определенному work-phone filter[work_phone]=+79876543211
mobile-phone Вывести контакты по определенному mobile-phone filter[mobile_phone]=+79876543211
other-phone Вывести контакты по определенному other-phone filter[other_phone]=+79876543211
any-phone Вывести контакты, в которых из одном из телефонных полей хранится значение any-phone filter[any_phone]=+79876543211
email Вывести контакты по определенному email filter[email]=support@syncrm.ru
other-email Вывести контакты по определенному other-email filter[other-email]=support@syncrm.ru
created-at-gte Вывести контакты, созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести контакты, созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести контакты, обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести контакты, обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Статусы

Создание статуса контакта

curl "https://app.syncrm.ru/api/v1/contact-statuses" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"contact-statuses",
         "attributes":{
           "name":"Статус контакта в API",
           "color":"#000000"
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/contact-statuses");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"contact-statuses\",\"attributes\":{\"name\":\"Статус контакта в API\",\"color\":\"#000000\"}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/contact-statuses')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"contact-statuses",
         "attributes":{
           "name":"Статус контакта в API",
           "color":"#000000"
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"contact-statuses",
         "attributes":{
           "name":"Статус контакта в API",
           "color":"#000000"
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/contact-statuses", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/contact-statuses');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"contact-statuses",
         "attributes":{
           "name":"Статус контакта в API",
           "color":"#000000"
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"contact-statuses",
         "attributes":{
           "name":"Статус контакта в API",
           "color":"#000000"
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/contact-statuses', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/contact-statuses")
        .headers(headers)
        .body("{\"data\":{\"type\":\"contact-statuses\",\"attributes\":{\"name\":\"Статус контакта в API\",\"color\":\"#000000\"}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type contact-statuses
URL /api/v1/contact-statuses
Список GET /api/v1/contact-statuses
Чтение GET /api/v1/contact-statuses/{id}
Создание POST /api/v1/contact-statuses
Редактирование PATCH /api/v1/contact-statuses/{id}
Удаление DELETE /api/v1/contact-statuses/{id}

Атрибуты

Атрибуты статуса контакта

{
  "data": {
      "type":"contact-statuses",
      "id":"2",
      "attributes":{
        "created-at":"2022-02-22T12:22:22.222+03:00",
        "updated-at":"2022-02-22T12:22:22.222+03:00",
        "name": "Мой статус контакта",
        "color": "#1f2f3f"
      }
   }
}
Имя Тип Пример Запись Описание
name* string Мой статус контакта да Имя статуса контакта
color string #1f2f3f да Цвет статуса контакта
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Фильтры

Получить список статусов контактов, созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/contact-statuses" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/contact-statuses?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/contact-statuses?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/contact-statuses?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/contact-statuses?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/contact-statuses?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/contact-statuses?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести статусы контактов созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести статусы контактов созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести статусы контактов обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести статусы контактов обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Типы

Создание типа контакта

curl "https://app.syncrm.ru/api/v1/contact-types" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"contact-types",
         "attributes":{
           "name":"Тип контакта в API"
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/contact-types");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"contact-types\",\"attributes\":{\"name\":\"Тип контакта в API\"}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/contact-types')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"contact-types",
         "attributes":{
           "name":"Тип контакта в API"
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"contact-types",
         "attributes":{
           "name":"Тип контакта в API"
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/contact-types", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/contact-types');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"contact-types",
         "attributes":{
           "name":"Тип контакта в API"
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"contact-types",
         "attributes":{
           "name":"Тип контакта в API"
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/contact-types', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/contact-types")
        .headers(headers)
        .body("{\"data\":{\"type\":\"contact-types\",\"attributes\":{\"name\":\"Тип контакта в API\"}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type contact-types
URL /api/v1/contact-types
Список GET /api/v1/contact-types
Чтение GET /api/v1/contact-types/{id}
Создание POST /api/v1/contact-types
Редактирование PATCH /api/v1/contact-types/{id}
Удаление DELETE /api/v1/contact-types/{id}

Атрибуты

Атрибуты типа контакта

{
  "data": {
      "type":"contact-types",
      "id":"2",
      "attributes":{
        "created-at":"2022-02-22T12:22:22.222+03:00",
        "updated-at":"2022-02-22T12:22:22.222+03:00",
        "name": "Мой тип контакта"
      }
   }
}
Имя Тип Пример Запись Описание
name* string Мой тип контакта да Имя типа контакта
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Фильтры

Получить список типов контактов, созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/contact-types" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/contact-types?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/contact-types?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/contact-types?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/contact-types?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/contact-types?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/contact-types?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести типы контактов созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести типы контактов созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести типы контактов обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести типы контактов обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Договоры

Создание договора с предустановленными сторонами

curl "https://app.syncrm.ru/api/v1/contracts" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"contracts",
         "attributes":{
           "name":"Трудовой договор",
           "date":"2022-02-22"
         },
         "relationships":{
           "first-party":{
             "data":{
               "type":"contacts",
               "id":"2"
             }
           },
           "second-party":{
             "data":{
               "type":"companies",
               "id":"2"
             }
           }
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/contracts");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"contracts\",\"attributes\":{\"name\":\"Трудовой договор\",\"date\":\"2022-02-22\"},\"relationships\":{\"first-party\":{\"data\":{\"type\":\"contacts\",\"id\":\"2\"}},\"second-party\":{\"data\":{\"type\":\"companies\",\"id\":\"2\"}}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/contracts')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"contracts",
         "attributes":{
           "name":"Трудовой договор",
           "date":"2022-02-22"
         },
         "relationships":{
           "first-party":{
             "data":{
               "type":"contacts",
               "id":"2"
             }
           },
           "second-party":{
             "data":{
               "type":"companies",
               "id":"2"
             }
           }
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"contracts",
         "attributes":{
           "name":"Трудовой договор",
           "date":"2022-02-22"
         },
         "relationships":{
           "first-party":{
             "data":{
               "type":"contacts",
               "id":"2"
             }
           },
           "second-party":{
             "data":{
               "type":"companies",
               "id":"2"
             }
           }
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/contracts", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/contracts');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"contracts",
         "attributes":{
           "name":"Трудовой договор",
           "date":"2022-02-22"
         },
         "relationships":{
           "first-party":{
             "data":{
               "type":"contacts",
               "id":"2"
             }
           },
           "second-party":{
             "data":{
               "type":"companies",
               "id":"2"
             }
           }
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"contracts",
         "attributes":{
           "name":"Трудовой договор",
           "date":"2022-02-22"
         },
         "relationships":{
           "first-party":{
             "data":{
               "type":"contacts",
               "id":"2"
             }
           },
           "second-party":{
             "data":{
               "type":"companies",
               "id":"2"
             }
           }
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/contracts', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/contracts")
        .headers(headers)
        .body("{\"data\":{\"type\":\"contracts\",\"attributes\":{\"name\":\"Трудовой договор\",\"date\":\"2022-02-22\"},\"relationships\":{\"first-party\":{\"data\":{\"type\":\"contacts\",\"id\":\"2\"}},\"second-party\":{\"data\":{\"type\":\"companies\",\"id\":\"2\"}}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type contracts
URL /api/v1/contracts
Список GET /api/v1/contracts
Чтение GET /api/v1/contracts/{id}
Создание POST /api/v1/contracts
Редактирование PATCH /api/v1/contracts/{id}
Удаление DELETE /api/v1/contracts/{id}

Атрибуты

Ниже приведен пример формата данных. В реальном ответе будут присутствовать все перечисленные атрибуты

{
  "data": {
      "type":"contracts",
      "id":"2",
      "attributes":{
        "created-at": "2022-02-22T12:02:22.222+03:00",
        "updated-at": "2022-02-22T12:02:22.222+03:00",
        "cached-at": "2022-02-22T12:02:22.222+03:00",
        "name": "Трудовой договор",
        "number": 22,
        "custom-number": "abc-22",
        "date": "2022-02-22",
        "archived-at": null,
        "customs":{
          "custom-1":"Значение",
          "custom-943":"2022-02-22T12:02:22.222+03:00"
        },
        "archived-at":null
      }
   }
}

Основные атрибуты

Имя Тип Пример Запись Описание
name string Трудовой договор да Название договора
number integer 22 да Номер договора
custom_number string abc-22 да № ручн.
date datetime 2022-02-22 да Дата договора
custom hash {"custom-1":'custom value'} да Свои поля
archived-at datetime 2022-02-22T12:02:22.222+03:00 да Дата архивации
previous-responsible-id integer 100 нет Предыдущий ответственный

Связи

Пример данных (перечислены не все связи)

{
  "data": {
      "type":"contracts",
      "id":"2",
      "relationships": {
        "first-party": {
          "links": {
            "self": "http://localhost:3000/api/v1/contracts/2/relationships/first-party",
            "related": "http://localhost:3000/api/v1/contracts/2/first-party"
          }
        },
        "second-party": {
          "links": {
            "self": "http://localhost:3000/api/v1/contracts/2/relationships/second-party",
            "related": "http://localhost:3000/api/v1/contracts/2/second-party"
          }
        }
      }
   }
}

Пример запроса с загруженными компаниями и заявками договора

curl "https://app.syncrm.ru/api/v1/contracts?include=companies,orders" \
  -H "Authorization: Bearer api_token"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/contracts?include=companies,orders");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/contracts?include=companies,orders')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/contracts?include=companies,orders", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/contracts?include=companies,orders');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/contracts?include=companies,orders', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/contracts?include=companies,orders")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}

Каждая связь может быть включена в JSON ответ через параметр include, согласно официальной спецификации JSON API Inclusion of Related Resources.

Название Связь JSON API type
Сторона 1 first-party companies, contacts
Сторона 2 second-party companies, contacts
Создатель user users
Компании companies companies
Контакты contacts contacts
Сделки deals deals
Заявки orders orders
Объекты недвижимости estate-properties estate-properties

Фильтры

Получить список договоров с определённым номером

curl -G "https://app.syncrm.ru/api/v1/contracts" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/contracts?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/contracts?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/contracts?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/contracts?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/contracts?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/contracts?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
number Вывести договор с указанным номером filter[number]=22
created-at-gte Вывести договоры созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести договоры созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести договоры обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести договоры обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00
discarded-at-gte Вывести договоры в корзине после указанного времени filter[discarded-at-gte]=2022.02.22 12:00
discarded-at-lte Вывести договоры в корзине до указанного времени filter[discarded-at-lte]=2022.02.22 12:00
table-state-id Вывести договоры по заданному табличному фильтру filter[table-state-id]=22
q Вывести договоры по поисковому запросу filter[q]=some-query
archived Вывести договоры в архиве filter[archived]=2
discarded Вывести договоры в корзине filter[discarded]=2
actual Вывести договоры объекты filter[actual]=2

Компании

Создание компании с предустановленным источником и ответственным

curl "https://app.syncrm.ru/api/v1/companies" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"companies",
         "attributes":{
           "name":"ООО Синергия Софт",
           "description":"Разработка компьютерного программного обеспечения"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           },
           "responsible":{
             "data":{
               "type":"users",
               "id":"2"
             }
           }
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/companies");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"companies\",\"attributes\":{\"name\":\"ООО Синергия Софт\",\"description\":\"Разработка компьютерного программного обеспечения\"},\"relationships\":{\"source\":{\"data\":{\"type\":\"sources\",\"id\":\"2\"}},\"responsible\":{\"data\":{\"type\":\"users\",\"id\":\"2\"}}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/companies')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"companies",
         "attributes":{
           "name":"ООО Синергия Софт",
           "description":"Разработка компьютерного программного обеспечения"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           },
           "responsible":{
             "data":{
               "type":"users",
               "id":"2"
             }
           }
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"companies",
         "attributes":{
           "name":"ООО Синергия Софт",
           "description":"Разработка компьютерного программного обеспечения"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           },
           "responsible":{
             "data":{
               "type":"users",
               "id":"2"
             }
           }
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/companies", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/companies');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"companies",
         "attributes":{
           "name":"ООО Синергия Софт",
           "description":"Разработка компьютерного программного обеспечения"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           },
           "responsible":{
             "data":{
               "type":"users",
               "id":"2"
             }
           }
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = '{
       "data":{
         "type":"companies",
         "attributes":{
           "name":"ООО Синергия Софт",
           "description":"Разработка компьютерного программного обеспечения"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           },
           "responsible":{
             "data":{
               "type":"users",
               "id":"2"
             }
           }
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/companies', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/companies")
        .headers(headers)
        .body("{\"data\":{\"type\":\"companies\",\"attributes\":{\"name\":\"ООО Синергия Софт\",\"description\":\"Разработка компьютерного программного обеспечения\"},\"relationships\":{\"source\":{\"data\":{\"type\":\"sources\",\"id\":\"2\"}},\"responsible\":{\"data\":{\"type\":\"users\",\"id\":\"2\"}}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type companies
URL /api/v1/companies
Список GET /api/v1/companies
Чтение GET /api/v1/companies/{id}
Создание POST /api/v1/companies
Редактирование PATCH /api/v1/companies/{id}
Удаление DELETE /api/v1/companies/{id}

Атрибуты

Атрибуты компании

{
    "data": {
      "type":"companies",
      "id":"2",
      "attributes":{
        "created-at": "2022-02-22T12:02:22.222+03:00",
        "updated-at": "2022-02-22T12:02:22.222+03:00",
        "name": "ООО Синергия Софт",
        "general-phone": "79876543211",
        "work-phone": "79876543211",
        "mobile-phone": "79876543211",
        "other-phone": "79876543211",
        "fax": "79876543211",
        "country": "Россия",
        "city": "Иннополис",
        "region": "Республика Татарстан",
        "address": "Университетская ул, д. 7, помещ. 503",
        "zip-code": "012345",
        "email": "email@mail.ru",
        "other-email": "mail@gmail.com",
        "website": "www.site.com",
        "juristic-country": "Россия",
        "juristic-region": "Республика Татарстан",
        "juristic-city": "Иннополис",
        "juristic-zip-code": "012345",
        "juristic-street": "Университетская",
        "juristic-house": "1",
        "juristic-build": "1",
        "juristic-office": "1",
        "actual-country": "Россия",
        "actual-region": "Республика Татарстан",
        "actual-city": "Иннополис",
        "actual-zip-code": "012345",
        "actual-street": "ул. Университетская",
        "actual-house": "22а",
        "actual-build": "2",
        "actual-office": "123",
        "mailing-country": "Россия",
        "mailing-region": "Республика Татарстан",
        "mailing-city": "Иннополис",
        "mailing-zip-code": "012345",
        "mailing-street": "Университетская",
        "mailing-house": "1",
        "mailing-build": "1",
        "mailing-office": "1",
        "inn": "0101010101",
        "description": "Разработка компьютерного программного обеспечения",
        "full-name": "Общество с ограниченной ответственностью Синергия Софт",
        "short-name": "ООО Синергия Софт",
        "ogrn": "0101010101010",
        "kpp": "010101010",
        "okved": "62.01",
        "manager-name": "Сидоров В.В.",
        "manager-position": "Генеральный директор",
        "lawfulness-base": null,
        "accountant": "Иванов И.И.",
        "customs": {
          "custom-98": "",
          "custom-9": ""
        },
        "archived-at": null
      }
   }
}

Основные атрибуты

Имя Тип Пример Запись Описание
name* string ООО Синергия Софт да Название
description string Разработка компьютерного программного обеспечения да Описание
general-phone string +79876543211 да Телефон (основной)
mobile-phone string +79876543211 да Телефон (мобильный)
work-phone string +79876543211 да Телефон (рабочий)
work-phone-postfix string 200 да Добавочный (рабочий)
other-phone string +79876543211 да Телефон (дополнительный)
other-phone-postfix string 200 да Добавочный (дополнительный)
fax string +79876543211 да Факс
email string help@syncrm.ru да E-mail адрес
other-email string help@syncrm.ru да E-mail адрес (дополнительный)
website string syncrm.ru да Сайт
country string РФ да Страна
region string Республика Татарстан да Регион
city string Иннополис да Город
address string Университетская ул, д. 7, помещ. 503 да Адрес
zip-code string 012345 да Индекс
custom hash {"custom-1":'custom value'} да Свои поля
created-at datetime 2022-02-22T12:02:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:02:22.222+03:00 нет Дата обновления
archived-at datetime 2022-02-22T12:02:22.222+03:00 да Дата архивации

* Обязательные поля

Фактический адрес

Имя Тип Пример Запись Описание
actual-country string Россия да Страна
actual-region string Республика Татарстан да Область, регион, край
actual-city string Иннополис да Город, населенный пункт
actual-zip-code string 012345 да Индекс
actual-street string ул. Университетская да Улица, проспект
actual-house string 22а да Номер дома
actual-build string 2 да Корпус
actual-office string 123 да Номер офиса

Юридический адрес

Имя Тип Пример Запись Описание
juristic-country string Россия да Страна
juristic-region string Республика Татарстан да Область, регион, край
juristic-city string Иннополис да Город, населенный пункт
juristic-zip-code string 012345 да Индекс
juristic-street string ул. Университетская да Улица, проспект
juristic-house string 22а да Номер дома
juristic-build string 2 да Корпус
juristic-office string 123 да Номер офиса

Почтовый адрес

Имя Тип Пример Запись Описание
mailing-country string Россия да Страна
mailing-region string Республика Татарстан да Область, регион, край
mailing-city string Иннополис да Город, населенный пункт
mailing-zip-code string 012345 да Индекс
mailing-street string ул. Университетская да Улица, проспект
mailing-house string 22а да Номер дома
mailing-build string 2 да Корпус
mailing-office string 123 да Номер офиса

Реквизиты

Имя Тип Пример Запись Описание
full-name string Общество с ограниченной ответственностью да Полное наименование
short-name string ООО "Синергия Софт" да Короткое наименование
inn string 0101010101 да ИНН
ogrn string 0101010101010 да ОГРН
kpp string 010101010 да КПП
okved string 62.01 да ОКВЭД
director string Иванов И.И. да Директор
accountant string Иванов И.И. да Бухгалтер
lawfulness-base string Значение да Правомочность
manager-name string Сидоров В.В. да ФИО руководителя
manager-position string Генеральный директор да Должность руководителя

Связи

Пример данных (перечислены не все связи)

{
    "data": {
      "type":"companies",
      "id":"2",
      "relationships":{
        "responsible":{
          "links":{
            "self":"/api/v1/contacts/2/relationships/responsible",
            "related":"/api/v1/contacts/2/responsible"
          }
        },
        "company-type":{
          "links":{
            "self":"/api/v1/contacts/2/relationships/company-type",
            "related":"/api/v1/contacts/2/company-type"
          }
        }
      }
   }
}

Пример запроса с загруженными отвественными и типом компании

curl "https://app.syncrm.ru/api/v1/companies?include=responsible,company-type" \
  -H "Authorization: Bearer api_token"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/companies?include=responsible,company-type");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/companies?include=responsible,company-type')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/companies?include=responsible,company-type", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/companies?include=responsible,company-type');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/companies?include=responsible,company-type', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/companies?include=responsible,company-type")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}

Установить статус у компании

curl "https://app.syncrm.ru/api/v1/companies/101010" \
  -X PATCH \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
{
  "data": {
    "id": "101010",
    "type": "companies",
    "relationships": {
      "status": {
        "data": {
          "type": "company-statuses",
          "id": "222"
        }
      }
    }
  }
}
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/companies/101010");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("PATCH");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\": {\"id\": \"101010\",\"type\": \"companies\",\"relationships\": {\"status\": {\"data\": {\"type\": \"company-statuses\",\"id\": \"222\"}}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/companies/101010')
req = Net::HTTP::Patch.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
  "data": {
    "id": "101010",
    "type": "companies",
    "relationships": {
      "status": {
        "data": {
          "type": "company-statuses",
          "id": "222"
        }
      }
    }
  }
}'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
  "data": {
    "id": "101010",
    "type": "companies",
    "relationships": {
      "status": {
        "data": {
          "type": "company-statuses",
          "id": "222"
        }
      }
    }
  }
}`)
	req, err := http.NewRequest("PATCH", "https://app.syncrm.ru/api/v1/companies/101010", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/companies/101010');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
  "data": {
    "id": "101010",
    "type": "companies",
    "relationships": {
      "status": {
        "data": {
          "type": "company-statuses",
          "id": "222"
        }
      }
    }
  }
}');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
  "data": {
    "id": "101010",
    "type": "companies",
    "relationships": {
      "status": {
        "data": {
          "type": "company-statuses",
          "id": "222"
        }
      }
    }
  }
}'

response = requests.patch('https://app.syncrm.ru/api/v1/companies/101010', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.patch("https://app.syncrm.ru/api/v1/companies/101010")
        .headers(headers)
        .body("{\"data\": {\"id\": \"101010\",\"type\": \"companies\",\"relationships\": {\"status\": {\"data\": {\"type\": \"company-statuses\",\"id\": \"222\"}}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}

Каждая связь может быть включена в JSON ответ через параметр include, согласно официальной спецификации JSON API Inclusion of Related Resources.

Название Связь JSON API type
Ответственный responsible users
Создатель user users
Источник source sources
Контакты contacts contacts
Статус status company-statuses
Тип company-type company-types
Сделки deals deals
Продукты products products
Спецификации entities-products entity-products
Задачи tasks diary-tasks
События events diary-events
Банк. реквизиты bank-details company-bank-details

Фильтры

Получить список компаний с определённым рабочим номером

curl -G "https://app.syncrm.ru/api/v1/companies" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[general_phone]=+79876543211"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/companies?filter[general_phone]=79876543211");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/companies?filter[general_phone]=79876543211')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/companies?filter[general_phone]=79876543211", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/companies?filter[general_phone]=79876543211');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/companies?filter[general_phone]=79876543211', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/companies?filter[general_phone]=79876543211")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
inn Вывести компании по определенному номеру ИНН filter[inn]=0101010101
kpp Вывести компании по определенному номеру КПП filter[kpp]=010101010
work-phone Вывести компании по определенному work-phone filter[work_phone]=+79876543211
general-phone Вывести компании по определенному general-phone filter[general_phone]=+79876543211
other-phone Вывести компании по определенному other-phone filter[other_phone]=+79876543211
any-phone Вывести компании в которых из одном из телефонных полей хранится значение any-phone filter[any_phone]=+79876543211
email Вывести компании по определенному email filter[email]=support@syncrm.ru
other-email Вывести компании по определенному other-email filter[other-email]=support@syncrm.ru
created-at-gte Вывести компании созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести компании созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести компании обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести компании обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Банковские реквизиты

Создание банковских реквизитов для компании

curl "https://app.syncrm.ru/api/v1/company-bank-details" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"company-bank-details",
         "attributes":{
           "name":"МОЕ НАЗВАНИЕ БАНКОВСКИХ РЕКВИЗИТОВ"
         },
         "relationships":{
           "company":{
             "data":{
               "type":"companies",
               "id":2
             }
           }
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/company-bank-details");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"company-bank-details\",\"attributes\":{\"name\":\"МОЕ НАЗВАНИЕ БАНКОВСКИХ РЕКВИЗИТОВ\"},\"relationships\":{\"company\":{\"data\":{\"type\":\"companies\",\"id\":2}}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/company-bank-details')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"company-bank-details",
         "attributes":{
           "name":"МОЕ НАЗВАНИЕ БАНКОВСКИХ РЕКВИЗИТОВ"
         },
         "relationships":{
           "company":{
             "data":{
               "type":"companies",
               "id":2
             }
           }
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"company-bank-details",
         "attributes":{
           "name":"МОЕ НАЗВАНИЕ БАНКОВСКИХ РЕКВИЗИТОВ"
         },
         "relationships":{
           "company":{
             "data":{
               "type":"companies",
               "id":2
             }
           }
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/company-bank-details", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/company-bank-details');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"company-bank-details",
         "attributes":{
           "name":"МОЕ НАЗВАНИЕ БАНКОВСКИХ РЕКВИЗИТОВ"
         },
         "relationships":{
           "company":{
             "data":{
               "type":"companies",
               "id":2
             }
           }
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"company-bank-details",
         "attributes":{
           "name":"МОЕ НАЗВАНИЕ БАНКОВСКИХ РЕКВИЗИТОВ"
         },
         "relationships":{
           "company":{
             "data":{
               "type":"companies",
               "id":2
             }
           }
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/company-bank-details', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/company-bank-details")
        .headers(headers)
        .body("{\"data\":{\"type\":\"company-bank-details\",\"attributes\":{\"name\":\"МОЕ НАЗВАНИЕ БАНКОВСКИХ РЕКВИЗИТОВ\"},\"relationships\":{\"company\":{\"data\":{\"type\":\"companies\",\"id\":2}}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type company-bank-details
URL /api/v1/company-bank-details
Список GET /api/v1/company-bank-details
Чтение GET /api/v1/company-bank-details/{id}
Создание POST /api/v1/company-bank-details
Редактирование PATCH /api/v1/company-bank-details/{id}
Удаление DELETE /api/v1/company-bank-details/{id}

Атрибуты

Атрибуты банковских реквизитов компании

{
  "data":{
      "id": "2",
      "type": "company-bank-details",
      "attributes":{
          "created-at": "2022-02-22T12:22:22.222+03:00",
          "updated-at": "2022-02-22T12:22:22.222+03:00",
          "name": "МОЕ НАЗВАНИЕ БАНКОВСКИХ РЕКВИЗИТОВ",
          "bank-name": "ПАО СБЕРБАНК",
          "bik": "000000000",
          "corr-number": "00000000000000000000",
          "number": "00000000000000000000",
          "is-default": true
      }
  }
}
Имя Тип Пример Запись Описание
name* string МОЕ НАЗВАНИЕ БАНКОВСКИХ РЕКВИЗИТОВ да Название набора реквизитов
bank-name string ПАО СБЕРБАНК да Имя банка
bik string 000000000 да БИК банка
corr-number string 00000000000000000000 да Корр. счет
number string 00000000000000000000 да Номер счета
is-default boolean true да Основные реквизиты?
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Связи

Загрузка банковских реквизитов по определенной компании (id = 2)

curl "https://app.syncrm.ru/api/v1/companies/2/relationships/bank-details" \
  -X GET \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/companies/2/relationships/bank-details");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/companies/2/relationships/bank-details')
req = Net::HTTP::Get.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/companies/2/relationships/bank-details", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/companies/2/relationships/bank-details');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/companies/2/relationships/bank-details', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/companies/2/relationships/bank-details")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Название Связь JSON API type
Компания company companies

Статусы

Создание статуса компании

curl "https://app.syncrm.ru/api/v1/company-statuses" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"company-statuses",
         "attributes":{
           "name":"Статус компании из API",
           "color":"#000000"
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/company-statuses");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"company-statuses\",\"attributes\":{\"name\":\"Статус компании из API\",\"color\":\"#000000\"}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/company-statuses')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"company-statuses",
         "attributes":{
           "name":"Статус компании из API",
           "color":"#000000"
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"company-statuses",
         "attributes":{
           "name":"Статус компании из API",
           "color":"#000000"
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/company-statuses", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/company-statuses');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"company-statuses",
         "attributes":{
           "name":"Статус компании из API",
           "color":"#000000"
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"company-statuses",
         "attributes":{
           "name":"Статус компании из API",
           "color":"#000000"
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/company-statuses', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/company-statuses")
        .headers(headers)
        .body("{\"data\":{\"type\":\"company-statuses\",\"attributes\":{\"name\":\"Статус компании из API\",\"color\":\"#000000\"}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type company-statuses
URL /api/v1/company-statuses
Список GET /api/v1/company-statuses
Чтение GET /api/v1/company-statuses/{id}
Создание POST /api/v1/company-statuses
Редактирование PATCH /api/v1/company-statuses/{id}
Удаление DELETE /api/v1/company-statuses/{id}

Атрибуты

Атрибуты статуса компании

{
  "data": {
      "type":"company-statuses",
      "id":"2",
      "attributes":{
        "created-at": "2022-02-22T12:22:22.222+03:00",
        "updated-at": "2022-02-22T12:22:22.222+03:00",
        "name": "Мой статус компании",
        "color": "#1f2f3f"
      }
   }
}
Имя Тип Пример Запись Описание
name* string Мой статус компании да Имя статуса компании
color string #1f2f3f да Цвет статуса компании
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Фильтры

Получить список статусов компаний созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/company-statuses" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/company-statuses?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/company-statuses?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/company-statuses?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/company-statuses?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/company-statuses?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/company-statuses?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести объекты созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести объекты созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести объекты обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести объекты обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Типы

Создание типа компании

curl "https://app.syncrm.ru/api/v1/company-types" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"company-types",
         "attributes":{
           "name":"Тип компании из API"
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/company-types");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"company-types\",\"attributes\":{\"name\":\"Тип компании из API\"}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/company-types')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"company-types",
         "attributes":{
           "name":"Тип компании из API"
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"company-types",
         "attributes":{
           "name":"Тип компании из API"
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/company-types", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/company-types');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"company-types",
         "attributes":{
           "name":"Тип компании из API"
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"company-types",
         "attributes":{
           "name":"Тип компании из API"
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/company-types', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/company-types")
        .headers(headers)
        .body("{\"data\":{\"type\":\"company-types\",\"attributes\":{\"name\":\"Тип компании из API\"}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type company-types
URL /api/v1/company-types
Список GET /api/v1/company-types
Чтение GET /api/v1/company-types/{id}
Создание POST /api/v1/company-types
Редактирование PATCH /api/v1/company-types/{id}
Удаление DELETE /api/v1/company-types/{id}

Атрибуты

Атрибуты типа компании

{
  "data": {
      "type":"company-types",
      "id":"2",
      "attributes":{
        "created-at":"2022-02-22T12:22:22.222+03:00",
        "updated-at":"2022-02-22T12:22:22.222+03:00",
        "name": "Мой тип компании"
      }
   }
}
Имя Тип Пример Запись Описание
name* string Мой тип компании да Имя типа компании
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Фильтры

Получить список типов компаний созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/company-types" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/company-types?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/company-types?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/company-types?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/company-types?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/company-types?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/company-types?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести типы компаний созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести типы компаний созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести типы компаний обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести типы компаний обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Сделки

Создание сделки с предустановленным источником

curl "https://app.syncrm.ru/api/v1/deals" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API",
           "planned-at":"2022-02-22"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           }
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deals");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"deals\",\"attributes\":{\"name\":\"Сделка по API\",\"planned-at\":\"2022-02-22\"},\"relationships\":{\"source\":{\"data\":{\"type\":\"sources\",\"id\":\"2\"}}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deals')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API",
           "planned-at":"2022-02-22"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           }
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API",
           "planned-at":"2022-02-22"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           }
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/deals", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deals');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API",
           "planned-at":"2022-02-22"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           }
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API",
           "planned-at":"2022-02-22"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           }
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/deals', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/deals")
        .headers(headers)
        .body("{\"data\":{\"type\":\"deals\",\"attributes\":{\"name\":\"Сделка по API\",\"planned-at\":\"2022-02-22\"},\"relationships\":{\"source\":{\"data\":{\"type\":\"sources\",\"id\":\"2\"}}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}

Создание сделки с привязанной заявкой

curl "https://app.syncrm.ru/api/v1/deals" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API с привязанной заявкой"
         },
         "relationships":{
            "orders": {
              "data" : [{
                "type": "orders",
                "id": 22222
              }]
            }
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deals");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"deals\",\"attributes\":{\"name\":\"Сделка по API с привязанной заявкой\"},\"relationships\":{\"orders\": {\"data\" : [{\"type\": \"orders\",\"id\": 22222}]}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deals')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API с привязанной заявкой"
         },
         "relationships":{
            "orders": {
              "data" : [{
                "type": "orders",
                "id": 22222
              }]
            }
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API с привязанной заявкой"
         },
         "relationships":{
            "orders": {
              "data" : [{
                "type": "orders",
                "id": 22222
              }]
            }
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/deals", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deals');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API с привязанной заявкой"
         },
         "relationships":{
            "orders": {
              "data" : [{
                "type": "orders",
                "id": 22222
              }]
            }
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API с привязанной заявкой"
         },
         "relationships":{
            "orders": {
              "data" : [{
                "type": "orders",
                "id": 22222
              }]
            }
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/deals', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/deals")
        .headers(headers)
        .body("{\"data\":{\"type\":\"deals\",\"attributes\":{\"name\":\"Сделка по API с привязанной заявкой\"},\"relationships\":{\"orders\": {\"data\" : [{\"type\": \"orders\",\"id\": 22222}]}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}

Создание сделки с привязанными продуктами

curl "https://app.syncrm.ru/api/v1/deals" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API с привязанными продуктами"
         },
         "relationships":{
            "products": {
              "data" : [{
                "type": "products",
                "id": 2222
              }, {
                "type": "products",
                "id": 222
              }]
            }
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deals");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"deals\",\"attributes\":{\"name\":\"Сделка по API с привязанными продуктами\"},\"relationships\":{\"products\": {\"data\" : [{\"type\": \"products\",\"id\": 2222}, {\"type\": \"products\",\"id\": 222}]}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deals')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API с привязанными продуктами"
         },
         "relationships":{
            "products": {
              "data" : [{
                "type": "products",
                "id": 2222
              }, {
                "type": "products",
                "id": 222
              }]
            }
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API с привязанными продуктами"
         },
         "relationships":{
            "products": {
              "data" : [{
                "type": "products",
                "id": 2222
              }, {
                "type": "products",
                "id": 222
              }]
            }
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/deals", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deals');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API с привязанными продуктами"
         },
         "relationships":{
            "products": {
              "data" : [{
                "type": "products",
                "id": 2222
              }, {
                "type": "products",
                "id": 222
              }]
            }
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"deals",
         "attributes":{
           "name":"Сделка по API с привязанными продуктами"
         },
         "relationships":{
            "products": {
              "data" : [{
                "type": "products",
                "id": 2222
              }, {
                "type": "products",
                "id": 222
              }]
            }
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/deals', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/deals")
        .headers(headers)
        .body("{\"data\":{\"type\":\"deals\",\"attributes\":{\"name\":\"Сделка по API с привязанными продуктами\"},\"relationships\":{\"products\": {\"data\" : [{\"type\": \"products\",\"id\": 2222}, {\"type\": \"products\",\"id\": 222}]}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type deals
URL /api/v1/deals
Список GET /api/v1/deals
Чтение GET /api/v1/deals/{id}
Создание POST /api/v1/deals
Редактирование PATCH /api/v1/deals/{id}
Удаление DELETE /api/v1/deals/{id}

Атрибуты

Атрибуты сделки

{
  "data": {
    "type":"deals",
    "id":"2",
    "attributes":{
      "name":"Моя сделка",
      "description":"Мое описание сделки",
      "amount":2200000.0,
      "number":22,
      "planned-at":null,
      "finished-at":"2022-02-22",
      "customs":{
        "custom-1":"Значение",
        "custom-943":"2022-02-22T12:02:22.222+03:00"
      },
      "created-at":"2022-02-22T12:02:22.222+03:00",
      "updated-at":"2022-02-22T12:02:22.222+03:00",
      "archived-at":null
    }
  }
}
Имя Тип Пример Запись Описание
name string Моя сделка да Имя сделки
description string Мое описание сделки да Подробное описание сделки
amount decimal 222.0 да Сумма сделки
cost decimal 222.0 да Себестомость сделки
profit decimal 222.0 нет Прибыль сделки
number integer 22 да Номер сделки
planned-at date 2022-02-22 да Планируемая дата закрытия
finished-at date 2022-02-22 да Фактическая дата закрытия
custom hash {"custom-1":'custom value'} да Свои поля
created-at datetime 2022-02-22T12:02:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:02:22.222+03:00 нет Дата обновления
archived-at datetime 2022-02-22T12:02:22.222+03:00 да Дата архивации

Связи

Пример данных (перечислены не все связи)

{
  "data": {
    "type":"deals",
    "id":"2",
    "relationships":{
      "responsible":{
        "links":{
          "self":"/api/v1/deals/2/relationships/responsible",
          "related":"/api/v1/deals/2/responsible"
        }
      },
      "stage-category":{
        "links":{
          "self":"/api/v1/deals/2/relationships/stage-category",
          "related":"/api/v1/deals/2/stage-category"
        }
      }
    }
  }
}

Пример запроса с загруженными источниками и отвественными

curl "https://app.syncrm.ru/api/v1/deals?include=source,responsible" \
  -H "Authorization: Bearer api_token"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deals?include=source,responsible");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deals?include=source,responsible')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/deals?include=source,responsible", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deals?include=source,responsible');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/deals?include=source,responsible', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/deals?include=source,responsible")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}

Каждая связь может быть включена в JSON ответ через параметр include, согласно официальной спецификации JSON API Inclusion of Related Resources.

Название Связь JSON API type
Ответственный responsible users
Создатель user users
Компания company companies
Контакт contact contacts
Этап stage deal-stages
Воронка stage-category deal-stage-categories
Источник source sources
Статус status deal-statuses
Причина поражения loss-reason deal-loss-reasons
Конкурент поражения loss-competitor competitors
Территория area areas
Продукты products products
Сделки deals deals
Заявки orders orders
Спецификации entities-products entity-products

Фильтры

Получить список сделок созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/deals" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deals?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deals?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/deals?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deals?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/deals?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/deals?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести сделки созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести сделки созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести сделки обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести сделки обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Причины поражения

Создание причины поражения сделок

curl "https://app.syncrm.ru/api/v1/deal-loss-reasons" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"deal-loss-reasons",
         "attributes":{
           "name":"Причины поражения из API"
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deal-loss-reasons");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"deal-loss-reasons\",\"attributes\":{\"name\":\"Причины поражения из API\"}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deal-loss-reasons')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"deal-loss-reasons",
         "attributes":{
           "name":"Причины поражения из API"
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"deal-loss-reasons",
         "attributes":{
           "name":"Причины поражения из API"
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/deal-loss-reasons", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deal-loss-reasons');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"deal-loss-reasons",
         "attributes":{
           "name":"Причины поражения из API"
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"deal-loss-reasons",
         "attributes":{
           "name":"Причины поражения из API"
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/deal-loss-reasons', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/deal-loss-reasons")
        .headers(headers)
        .body("{\"data\":{\"type\":\"deal-loss-reasons\",\"attributes\":{\"name\":\"Причины поражения из API\"}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type deal-loss-reasons
URL /api/v1/deal-loss-reasons
Список GET /api/v1/deal-loss-reasons
Чтение GET /api/v1/deal-loss-reasons/{id}
Создание POST /api/v1/deal-loss-reasons
Редактирование PATCH /api/v1/deal-loss-reasons/{id}
Удаление DELETE /api/v1/deal-loss-reasons/{id}

Атрибуты

Атрибуты причины поражения по сделке

{
  "data": {
      "type":"deal-loss-reasons",
      "id":"2",
      "attributes":{
        "created-at":"2022-02-22T12:22:22.222+03:00",
        "updated-at":"2022-02-22T12:22:22.222+03:00",
        "name": "Моя причина поражения"
      }
   }
}
Имя Тип Пример Запись Описание
name* string Моя причина поражения да Название причины поражения сделки
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Фильтры

Получить список причин поражений сделок созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/deal-loss-reasons" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deal-loss-reasons?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deal-loss-reasons?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/deal-loss-reasons?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deal-loss-reasons?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/deal-loss-reasons?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/deal-loss-reasons?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести причины поражения созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести причины поражения созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести причины поражения обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести причины поражения обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Воронки

Создание новой категории этапов сделки

curl "https://app.syncrm.ru/api/v1/deal-stage-categories" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"deal-stage-categories",
         "attributes":{
           "name":"Воронка сделок из API"
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deal-stage-categories");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"deal-stage-categories\",\"attributes\":{\"name\":\"Воронка сделок из API\"}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deal-stage-categories')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"deal-stage-categories",
         "attributes":{
           "name":"Воронка сделок из API"
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"deal-stage-categories",
         "attributes":{
           "name":"Воронка сделок из API"
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/deal-stage-categories", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deal-stage-categories');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"deal-stage-categories",
         "attributes":{
           "name":"Воронка сделок из API"
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"deal-stage-categories",
         "attributes":{
           "name":"Воронка сделок из API"
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/deal-stage-categories', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/deal-stage-categories")
        .headers(headers)
        .body("{\"data\":{\"type\":\"deal-stage-categories\",\"attributes\":{\"name\":\"Воронка сделок из API\"}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type deal-stage-categories
URL /api/v1/deal-stage-categories
Список GET /api/v1/deal-stage-categories
Чтение GET /api/v1/deal-stage-categories/{id}
Создание POST /api/v1/deal-stage-categories
Редактирование PATCH /api/v1/deal-stage-categories/{id}
Удаление DELETE /api/v1/deal-stage-categories/{id}

Атрибуты

Атрибуты воронки сделок

{
  "data": {
      "type":"deal-stage-categories",
      "id":"2",
      "attributes":{
        "created-at":"2022-02-22T12:22:22.222+03:00",
        "updated-at":"2022-02-22T12:22:22.222+03:00",
        "name": "Воронка сделок",
        "calculation-method": "by_billings",
        "is-default": true,
        "win-by-diaries": false
      }
   }
}
Имя Тип Пример Запись Описание
name* string Воронка сделок да Название воронки
amount-calc-method* string invoices да Способ расчета суммы сделки
cost-calc-method* string payments да Способ расчета себестоимости сделки
amount-calc-field string custom_1 да Поле формулы при расчете суммы сделки по формуле
cost-calc-field string custom_2 да Поле формулы при расчете себестоимости сделки по формуле
is-default boolean true да По-умолчанию
win-by-diaries boolean false да Cчитать сделку выиграной, eсли все задачи выполнены
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Ограничения по значениям

Аттрибут Варианты
amount-calc-method manually, invoices, products, payments, formula
cost-calc-method manually, products, payments, formula

Фильтры

Получить список категорий этапов сделок созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/deal-stage-categories" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deal-stage-categories?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deal-stage-categories?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/deal-stage-categories?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deal-stage-categories?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/deal-stage-categories?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/deal-stage-categories?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести воронки сделок созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести воронки сделок созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести воронки сделок обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести воронки сделок обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Этапы

Создание нового этапа сделки

curl "https://app.syncrm.ru/api/v1/deal-stages" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
        "data":{
          "type":"deal-stages",
          "attributes":{
            "name":"Этап сделки в API"
          },
          "relationships":{
             "deal-stage-category": {
                "data": {
                    "type": "deal-stage-categories",
                    "id": 2
                }
             }
          }
        }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deal-stages");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"deal-stages\",\"attributes\":{\"name\":\"Этап сделки в API\"},\"relationships\":{ \"deal-stage-category\":{\"data\": { \"type\": \"deal-stage-categories\",\"id\": 2}}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deal-stages')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
        "data":{
          "type":"deal-stages",
          "attributes":{
            "name":"Этап сделки в API"
          },
          "relationships":{
             "deal-stage-category": {
                "data": {
                    "type": "deal-stage-categories",
                    "id": 2
                }
             }
          }
        }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
        "data":{
          "type":"deal-stages",
          "attributes":{
            "name":"Этап сделки в API"
          },
          "relationships":{
             "deal-stage-category": {
                "data": {
                    "type": "deal-stage-categories",
                    "id": 2
                }
             }
          }
        }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/deal-stages", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deal-stages');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
        "data":{
          "type":"deal-stages",
          "attributes":{
            "name":"Этап сделки в API"
          },
          "relationships":{
             "deal-stage-category": {
                "data": {
                    "type": "deal-stage-categories",
                    "id": 2
                }
             }
          }
        }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
        "data":{
          "type":"deal-stages",
          "attributes":{
            "name":"Этап сделки в API"
          },
          "relationships":{
             "deal-stage-category": {
                "data": {
                    "type": "deal-stage-categories",
                    "id": 2
                }
             }
          }
        }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/deal-stages', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/deal-stages")
        .headers(headers)
        .body("{\"data\":{\"type\":\"deal-stages\",\"attributes\":{\"name\":\"Этап сделки в API\"},\"relationships\":{ \"deal-stage-category\":{\"data\": { \"type\": \"deal-stage-categories\",\"id\": 2}}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type deal-stages
URL /api/v1/deal-stages
Список GET /api/v1/deal-stages
Чтение GET /api/v1/deal-stages/{id}
Создание POST /api/v1/deal-stages
Редактирование PATCH /api/v1/deal-stages/{id}
Удаление DELETE /api/v1/deal-stages/{id}

Атрибуты

Атрибуты этапа сделки

{
  "data": {
      "type":"deal-stages",
      "id":"2",
      "attributes":{
        "created-at": "2022-02-22T12:22:22.222+03:00",
        "updated-at": "2022-02-22T12:22:22.222+03:00",
        "name": "Мой этап сделки",
        "description": true,
        "duration": 20000,
        "color": "#ee66aa",
        "next-if-items-done": false
      }
   }
}
Имя Тип Пример Запись Описание
name* string Мой этап сделки да Название воронки
duration integer 20000 да Длительность этапа
next-if-items-done boolean false да Переходить на следующий этап, если все задачи выполнены
description boolean true да Описание
color string #ee66aa да Цвет этапа
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Фильтры

Получить список этапов сделок созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/deal-stages" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести этапы сделок, созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести этапы сделок, созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести этапы сделок, обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести этапы сделок, обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Статусы

Создание статуса сделки

curl "https://app.syncrm.ru/api/v1/deal-statuses" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"deal-statuses",
         "attributes":{
           "name":"Статус сделки в API",
           "color":"#000000"
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deal-statuses");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"deal-statuses\",\"attributes\":{\"name\":\"Статус сделки в API\",\"color\":\"#000000\"}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deal-statuses')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"deal-statuses",
         "attributes":{
           "name":"Статус сделки в API",
           "color":"#000000"
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"deal-statuses",
         "attributes":{
           "name":"Статус сделки в API",
           "color":"#000000"
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/deal-statuses", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deal-statuses');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"deal-statuses",
         "attributes":{
           "name":"Статус сделки в API",
           "color":"#000000"
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"deal-statuses",
         "attributes":{
           "name":"Статус сделки в API",
           "color":"#000000"
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/deal-statuses', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/deal-statuses")
        .headers(headers)
        .body("{\"data\":{\"type\":\"deal-statuses\",\"attributes\":{\"name\":\"Статус сделки в API\",\"color\":\"#000000\"}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type deal-statuses
URL /api/v1/deal-statuses
Список GET /api/v1/deal-statuses
Чтение GET /api/v1/deal-statuses/{id}
Создание POST /api/v1/deal-statuses
Редактирование PATCH /api/v1/deal-statuses/{id}
Удаление DELETE /api/v1/deal-statuses/{id}

Атрибуты

Атрибуты статуса сделки

{
  "data": {
      "type":"deal-statuses",
      "id":"2",
      "attributes":{
        "created-at":"2022-02-22T12:22:22.222+03:00",
        "updated-at":"2022-02-22T12:22:22.222+03:00",
        "name": "Мой статус сделки",
        "color": "#1f2f3f"
      }
   }
}
Имя Тип Пример Запись Описание
name* string Мой статус сделки да Имя статуса сделки
color string #1f2f3f да Цвет статуса сделки
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Фильтры

Получить список статусов сделок созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/deal-statuses" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deal-statuses?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deal-statuses?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/deal-statuses?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deal-statuses?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/deal-statuses?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/deal-statuses?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести статусы сделок созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести статусы сделок созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести статусы сделок обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести статусы сделок обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Заявки

Создание заявки с предустановленным источником

curl "https://app.syncrm.ru/api/v1/orders" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"orders",
         "attributes":{
           "name":"Заявка по API",
           "archived-at":"2022-02-22"
         },
         "relationships":{
           "source":{
             "data":{
               "type":"sources",
               "id":"2"
             }
           }
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/orders");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"orders\",\"attributes\":{\"name\":\"Заявка по API\",\"archived-at\":\"2022-02-22\"},\"relationships\":{\"source\":{\"data\":{\"type\":\"sources\",\"id\":\"2\"}}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/orders')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{       
  "data":{         
    "type":"orders",         
    "attributes":{           
      "name":"Заявка по API",           
      "archived-at":"2022-02-22"         
      },         
      "relationships":{           
        "source":{             
          "data":{               
            "type":"sources",               
            "id":"2"             
            }           
          }         
        }       
      }     
    }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{       
  "data":{         
    "type":"orders",         
    "attributes":{           
      "name":"Заявка по API",           
      "archived-at":"2022-02-22"         
      },         
      "relationships":{           
        "source":{             
          "data":{               
            "type":"sources",               
            "id":"2"             
            }           
          }         
        }       
      }     
    }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/orders", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/orders');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{       
  "data":{         
    "type":"orders",         
    "attributes":{           
      "name":"Заявка по API",           
      "archived-at":"2022-02-22"         
      },         
      "relationships":{           
        "source":{             
          "data":{               
            "type":"sources",               
            "id":"2"             
            }           
          }         
        }       
      }     
    }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{       
  "data":{         
    "type":"orders",         
    "attributes":{           
      "name":"Заявка по API",           
      "archived-at":"2022-02-22"         
      },         
      "relationships":{           
        "source":{             
          "data":{               
            "type":"sources",               
            "id":"2"             
            }           
          }         
        }       
      }     
    }'

response = requests.post('https://app.syncrm.ru/api/v1/orders', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/orders")
        .headers(headers)
        .body("{\"data\":{\"type\":\"orders\",\"attributes\":{\"name\":\"Заявка по API\",\"archived-at\":\"2022-02-22\"},\"relationships\":{\"source\":{\"data\":{\"type\":\"sources\",\"id\":\"2\"}}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}

Создание заявки с предустановленной сделкой

curl "https://app.syncrm.ru/api/v1/orders" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"orders",
         "attributes":{
           "name":"Заявка по API с предустановленной сделкой",
           "archived-at":"2022-02-22"
         },
         "relationships":{
           "deals": {
             "data" : [{
               "type": "deals",
               "id": 22222
             }]
           }
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/orders");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"orders\",\"attributes\":{\"name\":\"Заявка по API с предустановленной сделкой\",\"archived-at\":\"2022-02-22\"},\"relationships\":{\"deals\": {\"data\" : [{\"type\": \"deals\",\"id\": 22222}]}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/orders')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{       
  "data":{         
    "type":"orders",         
    "attributes":{           
      "name":"Заявка по API с предустановленной сделкой",           
      "archived-at":"2022-02-22"         
      },         
      "relationships":{           
        "deals": {             
          "data" : [{               
            "type": "deals",               
            "id":22222             
            }]           
          }         
        }       
      }     
    }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{       
  "data":{         
    "type":"orders",         
    "attributes":{           
      "name":"Заявка по API с предустановленной сделкой",           
      "archived-at":"2022-02-22"         
      },         
      "relationships":{           
        "deals": {             
          "data" : [{               
            "type": "deals",               
            "id":22222             
            }]           
          }         
        }       
      }     
    }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/orders", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/orders');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{       
  "data":{         
    "type":"orders",         
    "attributes":{           
      "name":"Заявка по API с предустановленной сделкой",           
      "archived-at":"2022-02-22"         
      },         
      "relationships":{           
        "deals": {             
          "data" : [{               
            "type": "deals",               
            "id":22222             
            }]           
          }         
        }       
      }     
    }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{       
  "data":{         
    "type":"orders",         
    "attributes":{           
      "name":"Заявка по API с предустановленной сделкой",           
      "archived-at":"2022-02-22"         
      },         
      "relationships":{           
        "deals": {             
          "data" : [{               
            "type": "deals",               
            "id":22222             
            }]           
          }         
        }       
      }     
    }'

response = requests.post('https://app.syncrm.ru/api/v1/orders', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/orders")
        .headers(headers)
        .body("{\"data\":{\"type\":\"orders\",\"attributes\":{\"name\":\"Заявка по API с предустановленной сделкой\",\"archived-at\":\"2022-02-22\"},\"relationships\":{\"deals\": {\"data\" : [{\"type\": \"deals\",\"id\": 22222}]}}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type orders
URL /api/v1/orders
Список GET /api/v1/orders
Чтение GET /api/v1/orders/{id}
Создание POST /api/v1/orders
Редактирование PATCH /api/v1/orders/{id}
Удаление DELETE /api/v1/orders/{id}

Атрибуты

Атрибуты заявки

{
  "data": {
      "type":"orders",
      "id":"2",
      "attributes":{
        "name":"Моя заявка",
        "description":"Мое описание заявки",
        "amount":"2222.0",
        "number":22,
        "archived-at":"2022-02-22",
        "customs":{
          "custom-11":"Значение",
          "custom-43":"2022-02-22T12:02:22.222+03:00"
        },
        "created-at":"2022-02-22T12:02:22.222+03:00",
        "updated-at":"2022-02-22T12:02:22.222+03:00"
      }
   }
}
Имя Тип Пример Запись Описание
name string Моя сделка да Имя заявки
description string Описание сделки да Подробное описание заявки
amount decimal 123.0 да Сумма заявки
number integer 2 да Номер заявки
customs hash {"custom-1":'custom value'} да Свои поля
created-at datetime 2022-02-22T12:02:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:02:22.222+03:00 нет Дата обновления
archived-at datetime 2022-02-22T12:02:22.222+03:00 да Дата архивации

Связи

Пример данных (перечислены не все связи)

{
  "data": {
      "type":"orders",
      "id":"2",
      "relationships":{
        "responsible":{
          "links":{
            "self":"/api/v1/orders/2/relationships/responsible",
            "related":"/api/v1/orders/2/responsible"
          }
        },
        "stage":{
          "links":{
            "self":"/api/v1/orders/2/relationships/stage",
            "related":"/api/v1/orders/2/stage"
          }
        }
      }
   }
}

Пример запроса с загруженными источниками и отвественными

curl "https://app.syncrm.ru/api/v1/orders?include=source,responsible" \
  -H "Authorization: Bearer api_token"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/orders?include=source,responsible");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/orders?include=source,responsible')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/orders?include=source,responsible", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/orders?include=source,responsible');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/orders?include=source,responsible', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/orders?include=source,responsible")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}

Каждая связь может быть включена в JSON ответ через параметр include, согласно официальной спецификации JSON API Inclusion of Related Resources.

Название Связь JSON API type
Ответственный responsible users
Создатель user users
Компания company companies
Контакт contact contacts
Этап stage order-stages
Источник source sources
Статус status order-statuses
Причина поражения loss-reason order-loss-reasons
Конкурент поражения loss-competitor competitors
Территория area areas
Продукты products products
Сделки deals deals
Спецификации entities-products entity-products

Фильтры

Получить список заявок до определённой даты

curl -G "https://app.syncrm.ru/api/v1/orders" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/orders?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/orders?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/orders?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/orders?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/orders?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/orders?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести заявки созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести заявки созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести заявки обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести заявки обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Причины поражения

Создание причины поражения заявки

curl "https://app.syncrm.ru/api/v1/order-loss-reasons" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"order-loss-reasons",
         "attributes":{
           "name":"Моя причина поражения"
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/order-loss-reasons");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"order-loss-reasons\",\"attributes\":{\"name\":\"Моя причина поражения\"}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/order-loss-reasons')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"order-loss-reasons",
         "attributes":{
           "name":"Моя причина поражения"
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"order-loss-reasons",
         "attributes":{
           "name":"Моя причина поражения"
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/order-loss-reasons", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/order-loss-reasons');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"order-loss-reasons",
         "attributes":{
           "name":"Моя причина поражения"
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"order-loss-reasons",
         "attributes":{
           "name":"Моя причина поражения"
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/order-loss-reasons', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/order-loss-reasons")
        .headers(headers)
        .body("{\"data\":{\"type\":\"order-loss-reasons\",\"attributes\":{\"name\":\"Моя причина поражения\"}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type order-loss-reasons
URL /api/v1/order-loss-reasons
Список GET /api/v1/order-loss-reasons
Чтение GET /api/v1/order-loss-reasons/{id}
Создание POST /api/v1/order-loss-reasons
Редактирование PATCH /api/v1/order-loss-reasons/{id}
Удаление DELETE /api/v1/order-loss-reasons/{id}

Атрибуты

Атрибуты причины поражения по заявке

{
  "data": {
      "type":"order-loss-reasons",
      "id":"1",
      "attributes":{
        "created-at":"2022-02-22T12:22:22.222+03:00",
        "updated-at":"2022-02-22T12:22:22.222+03:00",
        "name": "Моя причина поражения"
      }
   }
}
Имя Тип Пример Запись Описание
name* string Моя причина поражения да Название причины поражения заявки
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Фильтры

Получить список причин поражений заявок созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/order-loss-reasons" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/order-loss-reasons?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/order-loss-reasons?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/order-loss-reasons?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/order-loss-reasons?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/order-loss-reasons?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/order-loss-reasons?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести причины поражения созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести причины поражения созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести причины поражения обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести причины поражения обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Этапы

Создание нового этапа заявки

curl "https://app.syncrm.ru/api/v1/order-stages" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"deal-stages",
         "attributes":{
           "name":"Этап в API"
         },
       "relation"
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/order-stages");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"deal-stages\",\"attributes\":{\"name\":\"Этап в API\"},\"relation\"}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/order-stages')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"deal-stages",
         "attributes":{
           "name":"Этап в API"
         },
       "relation"
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"deal-stages",
         "attributes":{
           "name":"Этап в API"
         },
       "relation"
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/order-stages", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/order-stages');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"deal-stages",
         "attributes":{
           "name":"Этап в API"
         },
       "relation"
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"deal-stages",
         "attributes":{
           "name":"Этап в API"
         },
       "relation"
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/order-stages', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/order-stages")
        .headers(headers)
        .body("{\"data\":{\"type\":\"deal-stages\",\"attributes\":{\"name\":\"Этап в API\"},\"relation\"}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type order-stages
URL /api/v1/order-stages
Список GET /api/v1/order-stages
Чтение GET /api/v1/order-stages/{id}
Создание POST /api/v1/order-stages
Редактирование PATCH /api/v1/order-stages/{id}
Удаление DELETE /api/v1/order-stages/{id}

Атрибуты

Атрибуты этапа заявки

{
  "data": {
      "type":"order-stages",
      "id":"1",
      "attributes":{
        "created-at": "2022-02-22T12:22:22.222+03:00",
        "updated-at": "2022-02-22T12:22:22.222+03:00",
        "name": "Мой этап заявки",
        "description": true,
        "color": "#ee66aa",
        "duration": 20000,
        "next-if-items-done": false
      }
   }
}
Имя Тип Пример Запись Описание
name* string Мое название воронки да Название воронки
duration integer 20000 да Длительность этапа
next-if-items-done boolean false да Переходить на следующий этап, если все задачи выполнены
description boolean true да Описание
color string #ee66aa да Цвет этапа
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Фильтры

Получить список этапов заявок созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/deal-stages" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/deal-stages?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести этапы заявок созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести этапы заявок созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести этапы заявок обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести этапы заявок обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

Статусы

Создание статуса заявки

curl "https://app.syncrm.ru/api/v1/order-statuses" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"order-statuses",
         "attributes":{
           "name":"Статус заявки в API",
           "color":"#000000"
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/order-statuses");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"order-statuses\",\"attributes\":{\"name\":\"Статус заявки в API\",\"color\":\"#000000\"}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/order-statuses')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"order-statuses",
         "attributes":{
           "name":"Статус заявки в API",
           "color":"#000000"
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"order-statuses",
         "attributes":{
           "name":"Статус заявки в API",
           "color":"#000000"
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/order-statuses", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/order-statuses');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/vnd.api+json',
    'Authorization' => 'Bearer api_token',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
       "data":{
         "type":"order-statuses",
         "attributes":{
           "name":"Статус заявки в API",
           "color":"#000000"
         }
       }
     }');

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Content-Type': 'application/vnd.api+json',
    'Authorization': 'Bearer api_token',
}

data = '{
       "data":{
         "type":"order-statuses",
         "attributes":{
           "name":"Статус заявки в API",
           "color":"#000000"
         }
       }
     }'

response = requests.post('https://app.syncrm.ru/api/v1/order-statuses', headers=headers, data=data)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Content-Type", "application/vnd.api+json".parse().unwrap());
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.post("https://app.syncrm.ru/api/v1/order-statuses")
        .headers(headers)
        .body("{\"data\":{\"type\":\"order-statuses\",\"attributes\":{\"name\":\"Статус заявки в API\",\"color\":\"#000000\"}}}")
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
JSON API type order-statuses
URL /api/v1/order-statuses
Список GET /api/v1/order-statuses
Чтение GET /api/v1/order-statuses/{id}
Создание POST /api/v1/order-statuses
Редактирование PATCH /api/v1/order-statuses/{id}
Удаление DELETE /api/v1/order-statuses/{id}

Атрибуты

Атрибуты статуса заявки

{
  "data": {
      "type":"order-statuses",
      "id":"1",
      "attributes":{
        "created-at":"2022-02-22T12:22:22.222+03:00",
        "updated-at":"2022-02-22T12:22:22.222+03:00",
        "name": "Мой статус заявки",
        "color": "#1f2f3f"
      }
   }
}
Имя Тип Пример Запись Описание
name* string Мой статус заявки да Имя статуса заявки
color string #1f2f3f да Цвет статуса заявки
created-at datetime 2022-02-22T12:22:22.222+03:00 да Дата создания
updated-at datetime 2022-02-22T12:22:22.222+03:00 нет Дата обновления

* Обязательные поля

Фильтры

Получить список статусов заявок созданных до определённой даты

curl -G "https://app.syncrm.ru/api/v1/order-statuses" \
  -X GET \
  -H "Authorization: Bearer api_token" \
  --data-urlencode "filter[created-at-gte]=2022.02.22 12:00"

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/order-statuses?filter[created-at-gte]=2022.02.22 12:00");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");

		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/order-statuses?filter[created-at-gte]=2022.02.22 12:00')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer api_token'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, err := http.NewRequest("GET", "https://app.syncrm.ru/api/v1/order-statuses?filter[created-at-gte]=2022.02.22 12:00", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer api_token")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

Пример на PHP

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.syncrm.ru/api/v1/order-statuses?filter[created-at-gte]=2022.02.22 12:00');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization' => 'Bearer api_token',
]);

$response = curl_exec($ch);

curl_close($ch);

Пример на Python

import requests

headers = {
    'Authorization': 'Bearer api_token',
}

response = requests.get('https://app.syncrm.ru/api/v1/order-statuses?filter[created-at-gte]=2022.02.22 12:00', headers=headers)

Пример на Rust

extern crate reqwest;
use reqwest::header;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut headers = header::HeaderMap::new();
    headers.insert("Authorization", "Bearer api_token".parse().unwrap());

    let client = reqwest::blocking::Client::builder()
        .redirect(reqwest::redirect::Policy::none())
        .build()
        .unwrap();
    let res = client.get("https://app.syncrm.ru/api/v1/order-statuses?filter[created-at-gte]=2022.02.22 12:00")
        .headers(headers)
        .send()?
        .text()?;
    println!("{}", res);

    Ok(())
}
Фильтр Описание Пример
created-at-gte Вывести статусы заявок созданные после указанного времени filter[created-at-gte]=2022.02.22 12:00
created-at-lte Вывести статусы заявок созданные до указанного времени filter[created-at-lte]=2022.02.22 12:00
updated-at-gte Вывести статусы заявок обновлённые после указанного времени filter[updated-at-gte]=2022.02.22 12:00
updated-at-lte Вывести статусы заявок обновлённые до указанного времени filter[updated-at-lte]=2022.02.22 12:00

События

Создание события с предустановленным исполнителем и компанией

curl "https://app.syncrm.ru/api/v1/diary-events" \
  -X POST \
  -H "Content-Type: application/vnd.api+json" \
  -H "Authorization: Bearer api_token" \
  -d @- << EOF
     {
       "data":{
         "type":"diary-events",
         "attributes":{
           "name":"Задача по API",
           "description":"Данная задача было создана при помощи API",
           "start-time":"2022-02-22 12:00 +0300"
         },
         "relationships":{
           "responsible": {
             "data":{
               "type":"users",
               "id":"2"
             }
           },
           "company":{
             "data":{
               "type":"companies",
               "id":"22"
             }
           }
         }
       }
     }
EOF

Пример на Java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("https://app.syncrm.ru/api/v1/diary-events");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("POST");

		httpConn.setRequestProperty("Content-Type", "application/vnd.api+json");
		httpConn.setRequestProperty("Authorization", "Bearer api_token");

		httpConn.setDoOutput(true);
		OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
		writer.write("{\"data\":{\"type\":\"diary-events\",\"attributes\":{\"name\":\"Задача по API\",\"description\":\"Данная задача было создана при помощи API\",\"start-time\":\"2022-02-22 12:00 +0300\"},\"relationships\":{\"responsible\": {\"data\":{\"type\":\"users\",\"id\":\"2\"}},\"company\":{\"data\":{\"type\":\"companies\",\"id\":\"22\"}}}}}");
		writer.flush();
		writer.close();
		httpConn.getOutputStream().close();

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? s.next() : "";
		System.out.println(response);
	}
}

Пример на Ruby

require 'net/http'

uri = URI('https://app.syncrm.ru/api/v1/diary-events')
req = Net::HTTP::Post.new(uri)
req.content_type = 'application/vnd.api+json'
req['Authorization'] = 'Bearer api_token'

req.body = '{
       "data":{
         "type":"diary-events",
         "attributes":{
           "name":"Задача по API",
           "description":"Данная задача было создана при помощи API",
           "start-time":"2022-02-22 12:00 +0300"
         },
         "relationships":{
           "responsible": {
             "data":{
               "type":"users",
               "id":"2"
             }
           },
           "company":{
             "data":{
               "type":"companies",
               "id":"22"
             }
           }
         }
       }
     }'

req_options = {
  use_ssl: uri.scheme == "https"
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(req)
end

Пример на GO

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{
       "data":{
         "type":"diary-events",
         "attributes":{
           "name":"Задача по API",
           "description":"Данная задача было создана при помощи API",
           "start-time":"2022-02-22 12:00 +0300"
         },
         "relationships":{
           "responsible": {
             "data":{
               "type":"users",
               "id":"2"
             }
           },
           "company":{
             "data":{
               "type":"companies",
               "id":"22"
             }
           }
         }
       }
     }`)
	req, err := http.NewRequest("POST", "https://app.syncrm.ru/api/v1/diary-events", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/vnd.api+json")
	req.Header