Нора Тарифы Кабинет

API и вебхуки

Связать Нору с Make, n8n, Albato, Zapier, сайтом или своей программой: читать и создавать людей, компании, сделки, задачи и заметки, получать события на свой адрес.

Быстрый старт

  1. В кабинете откройте Подключения → API и вебхуки и создайте ключ. Ключ показывается один раз: сохраните его сразу.
  2. Передавайте ключ в заголовке Authorization: Bearer <ключ>.
  3. Адрес для всех запросов: https://noracrm.me/v1.
curl https://noracrm.me/v1/me \
  -H "Authorization: Bearer nk_XXXXXXXXXXXXXXXX_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Ответ: название кабинета, имя ключа, открытые разделы, список событий и этапов сделки.

Открытый API и вебхуки работают на тарифах Соло и Команда. На бесплатном тарифе запросы получают ответ 402.

Ключи и права

Адреса

Метод и адресЧто делаетПрава
GET /v1/meКабинет, ключ, разделы, события, этапылюбой ключ
GET /v1/eventsСписок событий вебхуковлюбой ключ
GET /v1/{раздел}Список страницамичтение
GET /v1/{раздел}/{id}Одна записьчтение
POST /v1/{раздел}Создать записьзапись
PATCH /v1/{раздел}/{id}Изменить поля записизапись
POST /v1/deals/{id}/stageСменить этап сделкизапись
POST /v1/invoicesСоздать черновик счетазапись
GET|POST /v1/hooks, DELETE /v1/hooks/{id}Подписки на события из Zapier, Make, n8nзапись

Разделы: people (люди), orgs (компании), deals (сделки), invoices (счета), tasks (задачи), notes (заметки). Удаление по API закрыто: удаляйте в кабинете.

Списки, курсор, updated_since

Список отдается по возрастанию времени изменения. Параметры: limit (1..200, по умолчанию 50), updated_since (ISO 8601 или миллисекунды), cursor (значение next_cursor из прошлого ответа).

curl "https://noracrm.me/v1/deals?updated_since=2026-11-01T00:00:00Z&limit=100" \
  -H "Authorization: Bearer $NORA_KEY"
{
  "data": [
    { "id": "d...", "title": "Монтаж 2 сплит-систем", "p": "p...", "amount": 48000,
      "stage": "calc", "created_at": "2026-11-03T09:12:40.120Z",
      "updated_at": "2026-11-05T14:02:11.004Z" }
  ],
  "has_more": true,
  "next_cursor": "WzE3NjIzNTE..."
}

Пока has_more равно true, запрашивайте следующую страницу с cursor. Для регулярной сверки сохраняйте updated_at последней записи и в следующий раз передавайте его в updated_since: записи с тем же временем придут повторно, сверяйте по id.

Создание и изменение

Тело запроса в JSON с заголовком Content-Type: application/json. Поля проверяются так же, как в формах кабинета; неизвестное поле дает ошибку с перечнем допустимых.

curl -X POST https://noracrm.me/v1/people \
  -H "Authorization: Bearer $NORA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Ирина Волкова","phone":"+7 921 000-00-00","email":"irina@mail.ru","tags":["С сайта"]}'
curl -X POST https://noracrm.me/v1/deals \
  -H "Authorization: Bearer $NORA_KEY" -H "Content-Type: application/json" \
  -d '{"title":"Монтаж кондиционера","p":"p_ID_ЧЕЛОВЕКА","amount":25000}'

curl -X POST https://noracrm.me/v1/deals/d_ID_СДЕЛКИ/stage \
  -H "Authorization: Bearer $NORA_KEY" -H "Content-Type: application/json" \
  -d '{"stage":"agree"}'

curl -X PATCH https://noracrm.me/v1/tasks/t_ID_ЗАДАЧИ \
  -H "Authorization: Bearer $NORA_KEY" -H "Content-Type: application/json" \
  -d '{"done":true}'

Ответ на создание: 201 и запись целиком, на изменение: 200 и запись. Смена этапа попадает в ленту сделки, как из кабинета.

Поля

РазделПоля для записи
peoplename (до 80), phone, email, org (id компании), role, ch (tg, wa, max, phone, mail), tags (список), source, city, comment
orgsname (до 120), full, inn (10 или 12 цифр), kpp, ogrn, kind, city, address, director, phone, email, site
dealstitle (до 120), p (id человека), org, amount, stage, resp_u, source, comment
taskstext (до 300), p, deal_id, due_date (ГГГГ-ММ-ДД), done, resp_u
notestext (до 4000), p, deal_id

Жирным выделены обязательные при создании. Этапы сделки: new новая, calc расчет, agree согласование, work в работе, act акт, paid оплачено. Ответственный resp_u принимается, только если он есть в команде кабинета.

Счета

Счета читаются как другие разделы. Создать можно только черновик: номер, НДС и срок оплаты Нора ставит сама, выставляет и отправляет счет человек в кабинете.

curl -X POST https://noracrm.me/v1/invoices \
  -H "Authorization: Bearer $NORA_KEY" -H "Content-Type: application/json" \
  -d '{"p":"p_ID_ЧЕЛОВЕКА","items":[{"name":"Монтаж","qty":1,"price":25000}],"due_days":5}'

Поля: p или deal_id (тогда клиент и позиции берутся из сделки), items, what, comment, due_iso или due_days, currency, fx_rate. Статус счета (st): draft, wait, late, paid, cancelled.

Ошибки и лимиты

Ошибка всегда приходит словами в поле text и кодом в поле error:

{ "error": "bad_field", "field": "email", "text": "Почта указана неверно" }
Код ответаКогда
400Поле не прошло проверку, неизвестное поле, неверный курсор
401Нет ключа, ключ неверный или отозван
402Бесплатный тариф или кабинет только для чтения
403Ключ только для чтения или раздел ключу не открыт
404Нет записи или адреса
405Метод закрыт (например, удаление)
429Больше 60 запросов в минуту на ключ

В каждом ответе заголовки X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (секунд до нового окна). При 429 есть Retry-After.

Вебхуки

Нора отправляет POST на ваш адрес, когда в кабинете что-то случилось, откуда бы ни пришло изменение: из кабинета, с формы на сайте, из банка, по API. Адрес задается в Подключения → API и вебхуки: только https://, внутренние адреса и нестандартные порты закрыты.

СобытиеКогдаdata
deal.createdНовая сделкасделка
deal.stage_changedСделка перешла на другой этап. Прошлый этап в previous.stageсделка
invoice.paidСчет отмечен оплаченным (вручную или по выписке банка)счет
lead.createdНовая заявка с формы на сайтезаявка: имя, телефон, почта, сообщение, метки, person_id, deal_id
person.createdНовый человекчеловек
task.doneЗадача отмечена выполненнойзадача
pingКнопка «Проверить» в кабинетеслужебное
POST /ваш-адрес HTTP/1.1
Content-Type: application/json; charset=utf-8
User-Agent: Nora-Webhooks/1.0 (+https://noracrm.me/developers)
X-Nora-Event: deal.stage_changed
X-Nora-Delivery: ev...           (id события, одинаковый во всех повторах)
X-Nora-Attempt: 1
X-Nora-Signature: t=1762351200,v1=5f2b...e9

{
  "id": "ev...",
  "event": "deal.stage_changed",
  "created_at": "2026-11-05T14:02:11.004Z",
  "data": { "id": "d...", "title": "Монтаж", "stage": "work", "amount": 48000, "p": "p..." },
  "previous": { "stage": "agree" }
}

Ответ и повторы

Проверка подписи

У каждого адреса свой секрет подписи (whsec_...), он показывается один раз при создании. Подпись: HMAC-SHA256 секрета от строки <t>.<тело запроса>, в шестнадцатеричном виде. Сверяйте с телом как оно пришло, до разбора JSON, и отклоняйте события старше 5 минут.

// Node.js 18+
import { createHmac, timingSafeEqual } from "node:crypto";
function noraOk(secret, rawBody, header) {
  const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header || "");
  if (!m || Math.abs(Date.now() / 1000 - Number(m[1])) > 300) return false;
  const want = createHmac("sha256", secret).update(m[1] + "." + rawBody).digest("hex");
  return timingSafeEqual(Buffer.from(want), Buffer.from(m[2]));
}
# Python 3
import hmac, hashlib, re, time
def nora_ok(secret: str, raw_body: bytes, header: str) -> bool:
    m = re.fullmatch(r"t=(\d+),v1=([0-9a-f]{64})", header or "")
    if not m or abs(time.time() - int(m[1])) > 300:
        return False
    want = hmac.new(secret.encode(), m[1].encode() + b"." + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(want, m[2])
<?php // PHP 7.4+
function nora_ok(string $secret, string $rawBody, string $header): bool {
  if (!preg_match('/^t=(\d+),v1=([0-9a-f]{64})$/', $header, $m)) return false;
  if (abs(time() - (int)$m[1]) > 300) return false;
  return hash_equals(hash_hmac('sha256', $m[1] . '.' . $rawBody, $secret), $m[2]);
}

Подписка из Zapier, Make, n8n

Сервисы, которые сами заводят адрес для события (REST Hooks), используют ключ с правом записи:

curl -X POST https://noracrm.me/v1/hooks \
  -H "Authorization: Bearer $NORA_KEY" -H "Content-Type: application/json" \
  -d '{"target_url":"https://hooks.zapier.com/hooks/standard/...","event":"deal.created"}'

curl -X DELETE https://noracrm.me/v1/hooks/wh_ID \
  -H "Authorization: Bearer $NORA_KEY"

Можно передать url или target_url, одно событие event или список events. Ответ 201 содержит id и secret. Событие доступно, если ключу открыт его раздел: заявки и новые люди требуют раздел «Люди», события сделок раздел «Сделки».

Make, n8n, Albato, Zapier

Вопросы и пожелания к API: support@noracrm.me.