API Enlivy
Conectează-ți sistemele și automatizează fluxurile de lucru cu API-ul Enlivy
Conectezi Enlivy, prin API, la celelalte aplicații și platforme pe care le folosești și construiești integrări care țin pasul cu firma ta pe măsură ce crește.
Obține cheia APICont gratuit, fără card.
GÂNDIT API-FIRST
Făcut pentru programatori. Gata pentru afaceri.
Tot ce poți face în Enlivy poți face și prin API, în limitele rolului și ale planului tău.
Aplicația Enlivy folosește chiar acest API, așa că ce faci în interfață poți face și dintr-un script, în limitele rolului tău, ale organizațiilor la care are acces tokenul și ale planului. Automatizezi sarcinile repetitive, conectezi Enlivy la sistemele pe care le ai deja și construiești fluxuri potrivite cu felul în care lucrează firma ta.
Endpoint-uri curate și stabile, cu documentație clară și fără dependență de furnizor. Fie că ești startup, fie firmă mare, livrezi automatizări și integrări în câteva zile, nu în luni.
-
Gândit modular
Conectezi doar ce îți trebuie (facturi, clienți, contracte și altele), fără să fii prins într-un sistem rigid.
-
Construiești mai repede, crești mai ușor
Cu un API rapid și stabil, echipa ta face automatizări și integrări în câteva zile, nu în luni.
-
Se leagă de sistemele tale
Conectezi Enlivy la sistemele de HR, financiar și CRM pe care le folosești deja.
-
Fără dependență de furnizor
Endpoint-uri curate și documentate, pe care le controlezi tu, cu toată flexibilitatea.
Ce îți ține afacerea pe loc
Integrări care se strică ușor și muncă manuală repetitivă: exact lucrurile care împiedică o afacere să crească.
-
Sisteme care nu comunică
Fără Enlivy: Legătura dintre HR, financiar și CRM înseamnă multă muncă manuală și integrări pe care nu te poți baza.
Cu Enlivy: Orice date din Enlivy sunt disponibile printr-un singur API curat, așa că sistemele tale se leagă în sfârșit între ele și rămân sincronizate.
-
Muncă manuală care nu crește cu tine
Fără Enlivy: Sarcinile manuale repetitive îți consumă timpul, aduc mai multe greșeli și te împiedică să crești cu încredere.
Cu Enlivy: Pui într-un script munca repetitivă, de la facturare la sincronizarea datelor, iar automatizarea o preia, oricât ai crește.
Referință API
Facturi prin API
Te conectezi direct la Enlivy prin API-ul public și lucrezi din cod cu datele contului tău: facturi, chitanțe, tranzacții, produse, utilizatori, contracte și altele.
Exemplele de mai jos acoperă operațiile cele mai frecvente cu facturi: listarea, citirea unei singure facturi, crearea uneia noi și actualizarea datelor unei facturi existente.
Afișezi facturile recente în dashboard-ul tău. Listezi facturile organizației cu paginare, filtre și metadate. Poți include în răspuns și detalii ale facturii, precum liniile și taxele.
/organizations/<organization_id>/invoices curl -G 'https://api.enlivy.com/organizations/<organization_id>/invoices' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'include=invoice_prefix,tag_ids,line_items,taxes' \
--data-urlencode 'include_meta=navigation' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const query = new URLSearchParams({
page: "1",
limit: "20",
include: "invoice_prefix,tag_ids,line_items,taxes",
include_meta: "navigation",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Obții informațiile detaliate ale unei anumite facturi din organizația ta: totalurile, liniile, statusul, taxele, etichetele și altele.
/organizations/<organization_id>/invoices/<invoice_id> curl -G 'https://api.enlivy.com/organizations/<organization_id>/invoices/<invoice_id>' \
--data-urlencode 'include=invoice_prefix,tag_ids,line_items,taxes' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const invoiceId = "<invoice_id>";
const query = new URLSearchParams({
include: "invoice_prefix,tag_ids,line_items,taxes",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/${invoiceId}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Creezi o factură nouă în organizația ta. Poți trimite date detaliate, precum utilizatorii expeditor și destinatar, prefixul facturii, moneda, liniile și altele.
/organizations/<organization_id>/invoices # source (internal), direction (outbound) și type (standard) iau valorile implicite dacă lipsesc.
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/invoices' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_receiver_user_id": "<org_user_receiver_id>",
"status": "draft",
"currency": "EUR",
"payment_method": "bank_transfer",
"delivery_method": "email",
"line_items": [
{
"name_lang_map": {
"en": "Web Development Services"
},
"quantity": 10,
"price": 75,
"type": "service",
"organization_tax_class_id": "<tax_class_id>"
}
]
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// source (internal), direction (outbound) și type (standard) iau valorile implicite dacă lipsesc.
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// clientul căruia i se emite factura
organization_receiver_user_id: "<org_user_receiver_id>",
// draft | pending | sent_email | paid | ...
status: "draft",
currency: "EUR",
// bank_transfer | card_payment | cash | ...
payment_method: "bank_transfer",
delivery_method: "email",
line_items: [
// sau trimiți organization_product_id ca să facturezi unul dintre produsele tale
{
name_lang_map: { en: "Web Development Services" },
quantity: 10,
price: 75,
type: "service",
organization_tax_class_id: "<tax_class_id>",
},
],
}),
}).then((response) => response.json());Actualizezi conținutul unei facturi existente: statusul (de exemplu emisă, plătită, anulată), metoda de plată, scadența, numărul, etichetele, notele și liniile de produse.
/organizations/<organization_id>/invoices/<invoice_id> curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/invoices/<invoice_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"status": "paid",
"payment_method": "bank_transfer",
"due_at": "2026-07-31T09:00:00Z"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const invoiceId = "<invoice_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/${invoiceId}` , {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// actualizare parțială: se modifică doar câmpurile trimise
status: "paid",
payment_method: "bank_transfer",
due_at: "2026-07-31T09:00:00Z",
}),
}).then((response) => response.json());Referință API
Planuri de plată prin API
Automatizezi complet facturarea recurentă. Un plan de plată app-managed este rulat în întregime de Enlivy. Planul emite facturile la frecvența stabilită de tine, debitează metoda de plată salvată și trece prin propriul ciclu de viață: pending, active, paused, cancelling, completed. Stabilești o singură dată ce conține, iar Enlivy îl facturează după program.
Referința de mai jos acoperă doar planurile app-managed. Enlivy lucrează și cu planuri găzduite de Stripe, în care Stripe deține abonamentul și face facturarea. Acestea se administrează din Stripe, așa că nu descriem aici cum le creezi sau le modifici. Un plan app-managed îl compui în două feluri: din faze definite de tine (propriile linii recurente și frecvența lor) sau dintr-un pachet comercial de tip abonament (un șablon reutilizabil). Exemplele de mai jos le acoperă pe amândouă, plus listarea, editarea, reconfigurarea și anularea.
Listezi planurile cu paginare, filtre și căutare full-text. Filtrezi după status, direcție (outbound / inbound), expeditor, destinatar, contract, cont bancar sau după oricare dintre intervalele de date (starts_at, ends_at, created_at, updated_at). Poți include în răspuns fazele și plățile generate.
/organizations/<organization_id>/billing-schedules # status: pending | active | payment_method_required | paused | cancelling | completed | cancelled
curl -G 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'status=active' \
--data-urlencode 'direction=outbound' \
--data-urlencode 'include=receiver_user,phases,payments' \
--data-urlencode 'include_meta=navigation' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// status: pending | active | payment_method_required | paused | cancelling | completed | cancelled
const query = new URLSearchParams({
page: "1",
limit: "20",
status: "active",
direction: "outbound",
include: "receiver_user,phases,payments",
include_meta: "navigation",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Obții un singur plan cu tot ce ține de el: fazele și liniile lor, plățile generate până acum, părțile implicate și pachetul sau contractul legat. Din next_payment_create_at afli când emite Enlivy următoarea factură, iar total / paid_total îți arată progresul.
/organizations/<organization_id>/billing-schedules/<billing_schedule_id> # includes: sender_user, receiver_user, contract, billing_package,
# subscription_term, phases, payments, deleted_by_user
curl -G 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/<billing_schedule_id>' \
--data-urlencode 'include=phases,payments,receiver_user,billing_package' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const billingScheduleId = "<billing_schedule_id>";
// includes: sender_user, receiver_user, contract, billing_package,
// subscription_term, phases, payments, deleted_by_user
const query = new URLSearchParams({
include: "phases,payments,receiver_user,billing_package",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/${billingScheduleId}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Cea mai directă cale de a factura: definești una sau mai multe faze, fiecare cu frecvența și liniile ei. Enlivy emite o factură la fiecare ciclu al unei faze și o încasează. Fazele există doar la planurile app-managed.
/organizations/<organization_id>/billing-schedules curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"management_type": "app_managed",
"direction": "outbound",
"status": "active",
"organization_sender_user_id": "<org_user_sender_id>",
"organization_receiver_user_id": "<org_user_receiver_id>",
"currency": "EUR",
"payment_method": "stripe_card_payment",
"organization_user_payment_method_id": "<payment_method_id>",
"name_lang_map": {
"en": "Monthly Retainer"
},
"note_lang_map": {
"en": "Includes support and hosting."
},
"is_email_notifications_active": true,
"email_notifications_to": "billing@acme.example",
"customer_can_reconfigure": false,
"customer_can_cancel": true,
"customer_can_pause": false,
"phases": [
{
"frequency": "monthly",
"execute_after": "2026-08-01",
"max_occurrences": 12,
"due_date_type": "custom_days",
"due_date_days": 14,
"order": 0,
"line_items": [
{
"name_lang_map": {
"en": "Retainer"
},
"quantity": 1,
"price": 500,
"organization_tax_class_id": "<tax_class_id>"
},
{
"organization_product_id": "<product_id>",
"quantity": 2,
"price": 49.9
}
]
}
]
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// exemplul acoperă doar app_managed
management_type: "app_managed",
// outbound = tu facturezi un client; inbound = tu ești facturat
direction: "outbound",
// facturarea începe imediat
status: "active",
// cel care facturează (tu)
organization_sender_user_id: "<org_user_sender_id>",
// clientul (obligatoriu pentru outbound)
organization_receiver_user_id: "<org_user_receiver_id>",
currency: "EUR",
// bank_transfer | card_payment | stripe_card_payment | paypal | cash | paid_by_personal_funds
payment_method: "stripe_card_payment",
// cardul salvat de pe care se încasează automat (trebuie să fie al destinatarului)
organization_user_payment_method_id: "<payment_method_id>",
name_lang_map: {
// hărți pe limbi, nu texte simple
en: "Monthly Retainer",
},
note_lang_map: { en: "Includes support and hosting." },
is_email_notifications_active: true,
email_notifications_to: "billing@acme.example",
// ce poate face singur clientul din portal
customer_can_reconfigure: false,
customer_can_cancel: true,
customer_can_pause: false,
// totalurile și datele (total, paid_total, starts_at, ends_at, next_payment_create_at)
// sunt calculate de Enlivy, NU le trimiți.
// phases sunt valabile DOAR pentru app_managed (stripe_hosted le respinge). Maximum 20.
phases: [
{
// weekly | biweekly | monthly | yearly
frequency: "monthly",
// data primei rulări pentru această fază
execute_after: "2026-08-01",
// se oprește după N facturi (lipsă = fără sfârșit)
max_occurrences: 12,
// immediate | end_of_month | custom_days
due_date_type: "custom_days",
// obligatoriu doar când due_date_type = custom_days
due_date_days: 14,
order: 0,
line_items: [
{
name_lang_map: {
// obligatoriu dacă nu trimiți organization_product_id
en: "Retainer",
},
quantity: 1,
// suma: zecimal cu semn, în unități ÎNTREGI (nu în cenți)
price: 500,
organization_tax_class_id: "<tax_class_id>",
},
{
// preia numele și taxele implicite din produs
organization_product_id: "<product_id>",
quantity: 2,
price: 49.9,
},
],
},
],
}),
}).then((response) => response.json());În loc să construiești fazele de mână, creezi planul dintr-un pachet comercial de tip abonament, pe care îl refolosești. Pachetul stabilește ce se facturează, iar tu alegi doar varianta de frecvență și ce elemente din grupurile pachetului incluzi.
/organizations/<organization_id>/billing-schedules/from-billing-package # Pachetul comercial aduce fazele și elementele, așa că nu le trimiți aici.
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/from-billing-package' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_billing_package_id": "<billing_package_id>",
"organization_billing_package_subscription_term_id": "<subscription_term_id>",
"selected_group_items": [
{
"id": "<group_item_id>",
"quantity": 1
},
{
"id": "<other_group_item_id>",
"quantity": 3
}
],
"organization_sender_user_id": "<org_user_sender_id>",
"organization_receiver_user_id": "<org_user_receiver_id>",
"status": "active",
"payment_method": "bank_transfer",
"currency": "EUR",
"start_at": "2026-11-01",
"is_email_notifications_active": true
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// Pachetul comercial aduce fazele și elementele, așa că nu le trimiți aici.
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/from-billing-package` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// atașezi un pachet comercial cu ABONAMENT; el definește fazele și elementele
organization_billing_package_id: "<billing_package_id>",
// opțional: alegi varianta de recurență; lipsă = cea implicită a pachetului
organization_billing_package_subscription_term_id: "<subscription_term_id>",
// opțional: alegi ce elemente din grupurile pachetului intră (și cantitățile)
selected_group_items: [
{ id: "<group_item_id>", quantity: 1 },
{ id: "<other_group_item_id>", quantity: 3 },
],
organization_sender_user_id: "<org_user_sender_id>",
organization_receiver_user_id: "<org_user_receiver_id>",
// pending | active
status: "active",
payment_method: "bank_transfer",
currency: "EUR",
start_at: "2026-11-01",
is_email_notifications_active: true,
}),
}).then((response) => response.json());Actualizezi metadatele (numele, notele, setările de notificare, opțiunile de self-service) și controlezi ciclul de viață prin status: pui pe pauză un plan activ, reiei unul pus pe pauză sau îl marchezi pentru anulare. Trimiți doar ce vrei să schimbi.
/organizations/<organization_id>/billing-schedules/<billing_schedule_id> # ca să schimbi CE se facturează într-un plan de plată creat din pachet,
# folosești /reconfigure de mai jos, nu editarea de aici.
curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/<billing_schedule_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"status": "paused",
"note_lang_map": {
"en": "Paused at customer request."
},
"is_email_notifications_active": false,
"customer_can_cancel": true
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const billingScheduleId = "<billing_schedule_id>";
// ca să schimbi CE se facturează într-un plan de plată creat din pachet,
// folosești /reconfigure de mai jos, nu editarea de aici.
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/${billingScheduleId}` , {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// ciclu de viață: active <-> paused; setezi "cancelling" ca să se oprească la finalul ciclului
status: "paused",
note_lang_map: { en: "Paused at customer request." },
is_email_notifications_active: false,
customer_can_cancel: true,
}),
}).then((response) => response.json());Schimbi ce facturează un plan creat dintr-un pachet: înlocuiești pachetul, schimbi perioada de abonament, ajustezi elementele alese și cantitățile, suprascrii prețuri sau adaugi linii personalizate facturate o singură dată. Începi întotdeauna cu o previzualizare: endpoint-ul de previzualizare returnează conținutul rezultat și eventualul calcul pro rata, înainte să fie debitat vreun ban.
/organizations/<organization_id>/billing-schedules/<billing_schedule_id>/preview-reconfigure +1# 1. Previzualizare: nu se aplică nimic; primești noua componență și proratarea
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/<billing_schedule_id>/preview-reconfigure' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_billing_package_id": "<billing_package_id>",
"organization_billing_package_subscription_term_id": "<subscription_term_id>",
"selected_group_items": [
{
"id": "<group_item_id>",
"quantity": 2,
"price_override": 39,
"pricing_currency": "EUR"
}
],
"custom_line_items": [
{
"name_lang_map": {
"en": "One-off setup"
},
"quantity": 1,
"price": 150
}
],
"proration_mode": "prorate_next_invoice"
}'
# 2. Aplici
curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/<billing_schedule_id>/reconfigure' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_billing_package_id": "<billing_package_id>",
"organization_billing_package_subscription_term_id": "<subscription_term_id>",
"selected_group_items": [
{
"id": "<group_item_id>",
"quantity": 2,
"price_override": 39,
"pricing_currency": "EUR"
}
],
"custom_line_items": [
{
"name_lang_map": {
"en": "One-off setup"
},
"quantity": 1,
"price": 150
}
],
"proration_mode": "prorate_next_invoice"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const billingScheduleId = "<billing_schedule_id>";
const headers = {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
};
// 1. Previzualizare: nu se aplică nimic; primești noua componență și proratarea
const result1 = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/${billingScheduleId}/preview-reconfigure` , {
method: "POST",
headers,
body: JSON.stringify({
organization_billing_package_id: "<billing_package_id>",
organization_billing_package_subscription_term_id: "<subscription_term_id>",
selected_group_items: [
// price_override + pricing_currency îți permit un preț diferit de cel din pachet
{
id: "<group_item_id>",
quantity: 2,
price_override: 39,
pricing_currency: "EUR",
},
],
custom_line_items: [{ name_lang_map: { en: "One-off setup" }, quantity: 1, price: 150 }],
// cum se facturează schimbarea: none | prorate_immediately | prorate_next_invoice
// (prorate_immediately cere un plan de plată activ)
proration_mode: "prorate_next_invoice",
}),
}).then((response) => response.json());
// 2. Aplici
const result2 = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/${billingScheduleId}/reconfigure` , {
method: "PUT",
headers,
body: JSON.stringify({
organization_billing_package_id: "<billing_package_id>",
organization_billing_package_subscription_term_id: "<subscription_term_id>",
selected_group_items: [
// price_override + pricing_currency îți permit un preț diferit de cel din pachet
{
id: "<group_item_id>",
quantity: 2,
price_override: 39,
pricing_currency: "EUR",
},
],
custom_line_items: [{ name_lang_map: { en: "One-off setup" }, quantity: 1, price: 150 }],
// cum se facturează schimbarea: none | prorate_immediately | prorate_next_invoice
// (prorate_immediately cere un plan de plată activ)
proration_mode: "prorate_next_invoice",
}),
}).then((response) => response.json());Citești analize agregate de venit recurent pe toate planurile: situația la un moment dat (summary, cu o proiecție pentru perioada următoare) sau evoluția lună de lună (history_monthly). Așa alimentezi dashboard-uri de MRR fără să descarci singur fiecare plan.
/organizations/<organization_id>/billing-schedules/analytics/summary # analyticsType: summary | history_monthly
curl -G 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/analytics/summary' \
--data-urlencode 'start_date=2026-01-01T00:00:00Z' \
--data-urlencode 'end_date=2026-12-31T23:59:59Z' \
--data-urlencode 'direction=outbound' \
--data-urlencode 'convert_to_currency=EUR' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const analyticsType = "summary";
// analyticsType: summary | history_monthly
const query = new URLSearchParams({
start_date: "2026-01-01T00:00:00Z",
end_date: "2026-12-31T23:59:59Z",
direction: "outbound",
convert_to_currency: "EUR",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/analytics/${analyticsType}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Ștergi un plan prin soft delete. Dacă vrei să-l păstrezi, e mai bine să setezi statusul pe cancelling (facturarea viitoare se oprește la finalul ciclului); îl ștergi doar când vrei să dispară. Îl poți restaura ulterior.
/organizations/<organization_id>/billing-schedules/<billing_schedule_id> # ștergere reversibilă; restaurezi cu POST /billing-schedules/restore/{scheduleId}
curl -X DELETE 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/<billing_schedule_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const billingScheduleId = "<billing_schedule_id>";
// ștergere reversibilă; restaurezi cu POST /billing-schedules/restore/{scheduleId}
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/${billingScheduleId}` , {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Referință API
Network Exchanges prin API
Prin API trimiți în e-Factura ANAF facturile către clienții din România și preiei facturile care îți sunt adresate. Un schimb (network exchange) este o singură transmitere a unei facturi către o instituție sau de la ea. Instituția acceptată este ANAF. Enlivy generează documentul UBL conform, îl trimite și urmărește răspunsul pe tot parcursul, ca să știi dacă documentul a fost acceptat, respins sau e încă în procesare.
Un schimb este de ieșire (trimiți o factură emisă de tine) sau de intrare (preiei documentele adresate ție). Referința începe cu pasul principal, trimiterea unei facturi, apoi trece la listarea și verificarea schimburilor, preluarea documentelor primite și descărcarea fișierelor semnate. Fiecare schimb are un status pe care îl poți verifica periodic.
Trimiți o factură emisă către o instituție din rețea. Cererea nu are body, pentru că se trimite chiar factura. Enlivy generează UBL-ul conform, îl transmite și returnează schimbul creat, cu statusul lui inițial. Instituțiile către care poate fi trimisă o factură le găsești chiar în datele ei.
/organizations/<organization_id>/invoices/<invoice_id> +1# 1. Afli instituțiile eligibile pentru factură.
# invoice.peppol_exchange_push_options listează instituțiile către care poți trimite;
# invoice.peppol_exchanges_pushed le listează pe cele deja trimise.
curl 'https://api.enlivy.com/organizations/<organization_id>/invoices/<invoice_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json'
# 2. Trimiți către o anumită instituție. Id-ul este un text, de exemplu "anaf" (România / ANAF).
# fără corp: documentul este factura
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/invoices/<invoice_id>/peppol/anaf' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json'
# Răspunsul este înregistrarea schimbului în rețea. Urmărești `status`:
# pending | processing | success | success_in_exchange_queue | success_pending_archive
# | change_required | rejected | rejected_at_exchange | failed | failed_credentials_expired
# Dacă instituția nu poate fi contactată, primești HTTP 503.const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const invoiceId = "<invoice_id>";
const institution = "anaf";
const headers = {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
};
// 1. Afli instituțiile eligibile pentru factură.
// invoice.peppol_exchange_push_options listează instituțiile către care poți trimite;
// invoice.peppol_exchanges_pushed le listează pe cele deja trimise.
const invoice = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/${invoiceId}` , {
method: "GET",
headers,
}).then((response) => response.json());
// 2. Trimiți către o anumită instituție. Id-ul este un text, de exemplu "anaf" (România / ANAF).
// fără corp: documentul este factura
const exchange = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/${invoiceId}/peppol/${institution}` , {
method: "POST",
headers,
}).then((response) => response.json());
// Răspunsul este înregistrarea schimbului în rețea. Urmărești `status`:
// pending | processing | success | success_in_exchange_queue | success_pending_archive
// | change_required | rejected | rejected_at_exchange | failed | failed_credentials_expired
// Dacă instituția nu poate fi contactată, primești HTTP 503. Listezi toate schimburile, cu paginare și filtre: le restrângi la o singură factură, filtrezi după statusul schimbului sau după starea facturii legate și limitezi intervalul de date. Așa construiești un dashboard de conformitate, cu ce s-a trimis și în ce stadiu e fiecare document.
/organizations/<organization_id>/invoices/network-exchanges # filtre: status, organization_invoice_id, invoice_state (starea facturii legate),
# created_at_from/to, updated_at_from/to, ids
curl -G 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'status=success' \
--data-urlencode 'include=invoice' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// filtre: status, organization_invoice_id, invoice_state (starea facturii legate),
// created_at_from/to, updated_at_from/to, ids
const query = new URLSearchParams({
page: "1",
limit: "20",
status: "success",
include: "invoice",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Obții un singur schimb: statusul, identificatorii de schimb și de mesaj de la instituție, răspunsul brut al instituției (response_json) și numele fișierelor generate. Incluzi parsed_data ca să primești conținutul documentului ca date structurate sau invoice pentru factura sursă.
/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id> # includes: organization, invoice, parsed_data (UBL-ul interpretat, ca date structurate), tag_ids
curl -G 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>' \
--data-urlencode 'include=parsed_data,invoice' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const peppolNetworkExchangeId = "<peppol_network_exchange_id>";
// includes: organization, invoice, parsed_data (UBL-ul interpretat, ca date structurate), tag_ids
const query = new URLSearchParams({
include: "parsed_data,invoice",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${peppolNetworkExchangeId}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Preiei documentele trimise către tine prin rețeaua unei instituții, de exemplu facturile de la furnizori care vin prin ANAF. Enlivy le descarcă și le înregistrează ca schimburi de intrare. Limitezi sincronizarea cu date_from.
/organizations/<organization_id>/invoices/network-exchanges/anaf/pull curl -G 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/anaf/pull' \
--data-urlencode 'date_from=2026-07-01' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const institutionId = "anaf";
const query = new URLSearchParams({
date_from: "2026-07-01",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${institutionId}/pull?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Descarci fișierele unui schimb: documentul UBL/XML conform, semnătura lui digitală și varianta PDF, ușor de citit. Fiecare cerere returnează fișierul ca stream.
/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/download +2# documentul UBL / XML semnat
curl 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/download' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
--remote-name --remote-header-name
# semnătura digitală detașată
curl 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/download-signature' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
--remote-name --remote-header-name
# versiunea PDF, ușor de citit
curl 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/download-pdf' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
--remote-name --remote-header-nameconst baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const peppolNetworkExchangeId = "<peppol_network_exchange_id>";
const headers = {
Authorization: `Bearer ${token}`,
};
// documentul UBL / XML semnat
const xml = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${peppolNetworkExchangeId}/download` , {
method: "GET",
headers,
}).then((response) => response.blob());
// semnătura digitală detașată
const signature = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${peppolNetworkExchangeId}/download-signature` , {
method: "GET",
headers,
}).then((response) => response.blob());
// versiunea PDF, ușor de citit
const pdf = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${peppolNetworkExchangeId}/download-pdf` , {
method: "GET",
headers,
}).then((response) => response.blob());Obții statusul de la instituție și detaliile de validare pentru un schimb. Te ajută când un document revine cu change_required sau rejected și ai nevoie de motive ca să-l corectezi și să-l retrimiți.
/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/information curl 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/information' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const peppolNetworkExchangeId = "<peppol_network_exchange_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${peppolNetworkExchangeId}/information` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Referință API
Tranzacții bancare prin API
Aduni toate mișcările din conturile tale într-un singur registru, apoi afli ce reprezintă fiecare. Tranzacțiile bancare ajung în Enlivy prin sincronizarea cu banca, din payout-urile Stripe sau prin introducere manuală. Prin API le clasifici după tipul de cost și le reconciliezi cu documentele pe care le achită: facturi, chitanțe și fluturași de salariu. Fiecare tranzacție are propria stare, de la backlog până la connected, adică legată integral.
Lucrezi cu două resurse. Tipurile de cost sunt categoriile pe care le refolosești la clasificare, precum „Salarii”, „Încasare client” sau „Software”, și fiecare stabilește de ce poate fi legată o tranzacție. Tranzacțiile bancare sunt mișcările propriu-zise. Exemplele de mai jos le acoperă pe amândouă, plus listarea, filtrarea, reconcilierea și analizele.
Listezi tipurile de cost cu care clasifici tranzacțiile. Fiecare are o etichetă tradusă, arată dacă legătura cu o entitate e obligatorie și ce tipuri de entitate acceptă.
/organizations/<organization_id>/bank-transaction-cost-types curl -G 'https://api.enlivy.com/organizations/<organization_id>/bank-transaction-cost-types' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=50' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const query = new URLSearchParams({
page: "1",
limit: "50",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/bank-transaction-cost-types?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Definești o categorie de clasificare. Stabilești dacă tranzacțiile de acest tip trebuie reconciliate și, dacă da, de ce tipuri de entitate pot fi legate. Un tip de cost poate avea un părinte, așa că poți construi o ierarhie.
/organizations/<organization_id>/bank-transaction-cost-types curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/bank-transaction-cost-types' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"title_lang_map": {
"en": "Client Payment",
"ro": "Încasare client"
},
"connection_required": true,
"connection_types": [
"invoice",
"receipt"
],
"organization_bank_transaction_cost_type_id": null
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/bank-transaction-cost-types` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
title_lang_map: {
en: "Client Payment",
// hartă pe limbi
ro: "Încasare client",
},
// o tranzacție de acest tip trebuie legată de o entitate de business?
connection_required: true,
// de ce tipuri de entități poate fi legată (obligatoriu când connection_required = true)
// opțiuni: invoice | receipt | payslip | bank_transaction | user
connection_types: [
"invoice",
"receipt",
],
// opțional: tipul de cost părinte, pentru o categorie ierarhică
organization_bank_transaction_cost_type_id: null,
}),
}).then((response) => response.json());Listezi tranzacțiile cu paginare, căutare și filtre. Filtrezi după starea clasificării, după direcție sau după o anumită entitate legată și restrângi intervalul de date. Poți include în răspuns tipul de cost atribuit și entitățile legate.
/organizations/<organization_id>/bank-transactions # state: backlog | classified | connected | connected_partially | danger | trashed
# pentru tranzacțiile legate de o anumită entitate, trimiți AMBII parametri:
# `&connection_entity_type=invoice&connection_entity_id=invoice_id` +
# căutare în text cu q=... (minimum 3 caractere) în loc de ids
curl -G 'https://api.enlivy.com/organizations/<organization_id>/bank-transactions' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'state=backlog' \
--data-urlencode 'direction=inbound' \
--data-urlencode 'include=cost_type,connection_entities,bank_account' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// state: backlog | classified | connected | connected_partially | danger | trashed
// pentru tranzacțiile legate de o anumită entitate, trimiți AMBII parametri:
// `&connection_entity_type=invoice&connection_entity_id=invoice_id` +
// căutare în text cu q=... (minimum 3 caractere) în loc de ids
const query = new URLSearchParams({
page: "1",
limit: "20",
state: "backlog",
direction: "inbound",
include: "cost_type,connection_entities,bank_account",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/bank-transactions?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Obții o singură tranzacție: suma și moneda, direcția, tipul de cost atribuit, entitățile de care e legată și, la tranzacțiile sincronizate, eventualele metadate Stripe de payout sau de raportare.
/organizations/<organization_id>/bank-transactions/<bank_transaction_id> # includes: organization, bank_account, cost_type, connection_entities, deleted_by_user, tag_ids
curl -G 'https://api.enlivy.com/organizations/<organization_id>/bank-transactions/<bank_transaction_id>' \
--data-urlencode 'include=cost_type,connection_entities,bank_account' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const bankTransactionId = "<bank_transaction_id>";
// includes: organization, bank_account, cost_type, connection_entities, deleted_by_user, tag_ids
const query = new URLSearchParams({
include: "cost_type,connection_entities,bank_account",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/bank-transactions/${bankTransactionId}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Înregistrezi manual o tranzacție (majoritatea ajung automat, prin sincronizarea cu banca sau din Stripe). O poți clasifica în același apel, dacă trimiți și tipul de cost și legăturile ei.
/organizations/<organization_id>/bank-transactions # starea se stabilește prin clasificare (implicit "backlog"), nu trebuie trimisă.
# opțional, clasifici direct cu organization_bank_transaction_cost_type_id + connection_entities (vezi mai jos).
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/bank-transactions' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"hash": "unique-dedupe-key",
"title": "Incoming transfer from Acme Studio",
"amount": 1200,
"currency": "EUR",
"organization_bank_account_id": "<bank_account_id>",
"sender_label": "ACME STUDIO SRL",
"note": "Invoice #2026-0142 settlement"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// starea se stabilește prin clasificare (implicit "backlog"), nu trebuie trimisă.
// opțional, clasifici direct cu organization_bank_transaction_cost_type_id + connection_entities (vezi mai jos).
const result = await fetch(`${baseUrl}/organizations/${organizationId}/bank-transactions` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// obligatoriu; unic în cadrul unui cont bancar (cheia de deduplicare la import)
hash: "unique-dedupe-key",
title: "Incoming transfer from Acme Studio",
// suma: zecimal cu semn, în unități ÎNTREGI (nu în cenți)
amount: 1200,
// direcția REZULTĂ din semn (pozitiv = încasare, negativ = plată)
currency: "EUR",
organization_bank_account_id: "<bank_account_id>",
// numele contrapartidei, așa cum apare în extrasul băncii
sender_label: "ACME STUDIO SRL",
note: "Invoice #2026-0142 settlement",
}),
}).then((response) => response.json());Pasul central al fluxului. Atribui un tip de cost ca să clasifici tranzacția, apoi o legi de entitățile pe care le achită. Enlivy actualizează starea pe parcurs: după ce atribui tipul de cost, tranzacția devine classified; după ce o legi de entități, devine connected (sau connected_partially, dacă sumele legate nu acoperă toată tranzacția).
/organizations/<organization_id>/bank-transactions/<bank_transaction_id> curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/bank-transactions/<bank_transaction_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_bank_transaction_cost_type_id": "<cost_type_id>",
"connection_entities": [
{
"connection_entity_type": "invoice",
"connection_entity_id": "<invoice_id>",
"amount": 1000
},
{
"connection_entity_type": "receipt",
"connection_entity_id": "<receipt_id>",
"amount": 200
}
]
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const bankTransactionId = "<bank_transaction_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/bank-transactions/${bankTransactionId}` , {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// 1. Clasifici: atribui un tip de cost. Starea trece din backlog în classified.
organization_bank_transaction_cost_type_id: "<cost_type_id>",
// 2. Reconciliezi: legi tranzacția de ce plătește.
// connection_entity_type trebuie să fie unul dintre connection_types permise de tipul de cost.
// Lista este un UPSERT:
// { connection_entity_type, connection_entity_id, amount } -> creează o legătură
// { id } -> păstrează o legătură existentă
// { id, _deleted: true } -> elimină o legătură
// (o legătură existentă lăsată afară NU se șterge)
// Sume care acoperă toată tranzacția -> "connected"; parțial -> "connected_partially".
connection_entities: [
{
connection_entity_type: "invoice",
connection_entity_id: "<invoice_id>",
amount: 1000,
},
{
connection_entity_type: "receipt",
connection_entity_id: "<receipt_id>",
amount: 200,
},
],
}),
}).then((response) => response.json());Citești analize agregate de cash-flow pe toate tranzacțiile: situația la un moment dat (summary) sau evoluția lună de lună (history_monthly). Le restrângi după cont, direcție, stare și interval de date și le poți converti într-o singură monedă de raportare.
/organizations/<organization_id>/bank-transactions/analytics/summary # analyticsType: summary | history_monthly
curl -G 'https://api.enlivy.com/organizations/<organization_id>/bank-transactions/analytics/summary' \
--data-urlencode 'start_date=2026-01-01' \
--data-urlencode 'end_date=2026-12-31' \
--data-urlencode 'direction=outbound' \
--data-urlencode 'convert_to_currency=EUR' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const analyticsType = "summary";
// analyticsType: summary | history_monthly
const query = new URLSearchParams({
start_date: "2026-01-01",
end_date: "2026-12-31",
direction: "outbound",
convert_to_currency: "EUR",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/bank-transactions/analytics/${analyticsType}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Ștergi o tranzacție prin soft delete (starea devine trashed), așa că o poți restaura ulterior.
/organizations/<organization_id>/bank-transactions/<bank_transaction_id> # ștergere reversibilă; restaurezi cu POST /bank-transactions/restore/{transactionId}
curl -X DELETE 'https://api.enlivy.com/organizations/<organization_id>/bank-transactions/<bank_transaction_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const bankTransactionId = "<bank_transaction_id>";
// ștergere reversibilă; restaurezi cu POST /bank-transactions/restore/{transactionId}
const result = await fetch(`${baseUrl}/organizations/${organizationId}/bank-transactions/${bankTransactionId}` , {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Referință API
Taxe prin API
Enlivy organizează taxele după modelul folosit de Stripe pentru codurile fiscale ale produselor, nu cu câte o clasă pentru fiecare țară. O clasă de impozitare este o categorie de produs după natura lui (Bunuri și servicii standard, Cărți, Alimente, Servicii digitale, Scutit), iar fiecare produs îl marchezi cu categoria din care face parte, niciodată cu un procent introdus de mână. Fiecare clasă are un set de cote de impozitare, câte una pentru fiecare țară sau situație de vânzare. La facturare, Enlivy alege singura cotă aplicabilă după țara și statutul fiscal al cumpărătorului, luând potrivirea cu prioritatea cea mai mare.
Exemplele de mai jos acoperă ambele niveluri: clasa (categoria) și cotele (rândurile pe țări de sub fiecare clasă).
Listezi categoriile fiscale ale produselor tale. Incluzi tax_rates_overview ca să primești un rezumat al cotelor de sub fiecare clasă.
/organizations/<organization_id>/tax-classes # filtre: name, description, ids
# include tax_rates_overview pentru un rezumat al cotelor fiecărei clase
curl -G 'https://api.enlivy.com/organizations/<organization_id>/tax-classes' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'include=tax_rates_overview' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// filtre: name, description, ids
// include tax_rates_overview pentru un rezumat al cotelor fiecărei clase
const query = new URLSearchParams({
page: "1",
limit: "20",
include: "tax_rates_overview",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/tax-classes?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Creezi câte o clasă pentru fiecare categorie de produse pe care o vinzi. O clasă este o categorie, nu o țară și nici o singură cotă; rândurile pe țări stau sub ea. Apoi fiecare produs indică prin organization_tax_class_id categoria din care face parte.
/organizations/<organization_id>/tax-classes # Creezi câte o clasă pentru fiecare CATEGORIE de produse pe care o vinzi (bunuri și servicii standard,
# cărți, alimente, cazare, servicii digitale / SaaS, scutite). O clasă este o categorie,
# nu o țară și nu o singură cotă; cotele pe țări stau în interiorul ei.
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/tax-classes' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"name_lang_map": {
"en": "Books & publications",
"ro": "Cărți și publicații"
},
"description_lang_map": {
"en": "Reduced-rate category for books and periodicals."
}
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// Creezi câte o clasă pentru fiecare CATEGORIE de produse pe care o vinzi (bunuri și servicii standard,
// cărți, alimente, cazare, servicii digitale / SaaS, scutite). O clasă este o categorie,
// nu o țară și nu o singură cotă; cotele pe țări stau în interiorul ei.
const result = await fetch(`${baseUrl}/organizations/${organizationId}/tax-classes` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// categoria, nu o cotă: hărți pe limbi
name_lang_map: {
en: "Books & publications",
ro: "Cărți și publicații",
},
description_lang_map: { en: "Reduced-rate category for books and periodicals." },
}),
}).then((response) => response.json());Actualizezi etichetele unei categorii sau o ștergi prin soft delete (o poți restaura ulterior). Dacă ștergi o clasă, rândurile ei de cote rămân fără categoria de care țin, așa că mai întâi le ștergi sau le muți la altă clasă.
/organizations/<organization_id>/tax-classes/<tax_class_id> +1# Actualizezi etichetele unei categorii
curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/tax-classes/<tax_class_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"name_lang_map": {
"en": "Books & publications (2026)"
}
}'
# ștergere reversibilă; restaurezi cu POST /tax-classes/restore/{taxClassId}
curl -X DELETE 'https://api.enlivy.com/organizations/<organization_id>/tax-classes/<tax_class_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const taxClassId = "<tax_class_id>";
// Actualizezi etichetele unei categorii
const result1 = await fetch(`${baseUrl}/organizations/${organizationId}/tax-classes/${taxClassId}` , {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
name_lang_map: { en: "Books & publications (2026)" },
}),
}).then((response) => response.json());
// ștergere reversibilă; restaurezi cu POST /tax-classes/restore/{taxClassId}
const result2 = await fetch(`${baseUrl}/organizations/${organizationId}/tax-classes/${taxClassId}` , {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Listezi rândurile de cote. Poți include în răspuns clasa părinte și locațiile în care se aplică fiecare rând. Pentru un rezumat pe fiecare clasă, folosește în schimb include-ul tax_rates_overview al clasei.
/organizations/<organization_id>/tax-rates # includes: organization, organization_tax_class, locations
curl -G 'https://api.enlivy.com/organizations/<organization_id>/tax-rates' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=50' \
--data-urlencode 'include=organization_tax_class,locations' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// includes: organization, organization_tax_class, locations
const query = new URLSearchParams({
page: "1",
limit: "50",
include: "organization_tax_class,locations",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/tax-rates?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());O cotă de impozitare este un rând din setul de cote al unei clase, nu o taxă de sine stătătoare. Fiecare rând are un domeniu de aplicare, o categorie de TVA EN16931 și o prioritate; la facturare, Enlivy alege, dintre rândurile care se potrivesc, pe cel cu prioritatea cea mai mare. Setul standard: vânzări interne în țara ta, taxare inversă B2B în UE, OSS pe fiecare țară și o regulă generală pentru restul lumii.
/organizations/<organization_id>/tax-rates +3# O cotă de impozitare este UN RÂND din setul de cote al unei clase, nu o taxă de sine stătătoare.
# Fiecare rând declară un domeniu (locații și/sau condiții pentru cumpărător), o categorie TVA EN16931
# (eu_vat_class) și o prioritate. La facturare, Enlivy alege rândul cu cea mai mare prioritate
# al cărui domeniu și cumpărător se potrivesc.
# Setul tipic pentru o categorie (țara de origine = România): patru modele.
#
# Intern, în țara de origine: implicit când vinzi în România
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/tax-rates' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_tax_class_id": "<standard_goods_class_id>",
"has_eu_vat_properties": true,
"is_compound": false,
"is_inclusive": false,
"name": "RO Domestic 21%",
"rate": 21,
"priority": 1000,
"eu_vat_class": "S",
"has_locations": true,
"locations": [
{
"country_code": "RO"
}
]
}'
# Taxare inversă UE B2B: 0%, se aplică DOAR firmelor înregistrate în scopuri de TVA din alte state UE
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/tax-rates' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_tax_class_id": "<standard_goods_class_id>",
"has_eu_vat_properties": true,
"is_compound": false,
"is_inclusive": false,
"name": "EU B2B Reverse Charge",
"rate": 0,
"priority": 900,
"eu_vat_class": "AE",
"vatex_code": "VATEX-EU-AE",
"is_business_entity": true,
"is_eu_vat_registered": true,
"has_locations": true,
"locations": [
{
"country_code": "DE"
},
{
"country_code": "FR"
}
]
}'
# Intern pe țară în UE (B2C digital / OSS): aplici cota țării cumpărătorului
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/tax-rates' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_tax_class_id": "<standard_goods_class_id>",
"has_eu_vat_properties": true,
"is_compound": false,
"is_inclusive": false,
"name": "DE Domestic 19%",
"rate": 19,
"priority": 800,
"eu_vat_class": "S",
"has_locations": true,
"locations": [
{
"country_code": "DE"
}
]
}'
# Restul lumii: în afara domeniului TVA, 0%, fără locații = regula de rezervă
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/tax-rates' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_tax_class_id": "<standard_goods_class_id>",
"has_eu_vat_properties": true,
"is_compound": false,
"is_inclusive": false,
"name": "Rest of World (Outside Scope)",
"rate": 0,
"priority": 100,
"eu_vat_class": "O",
"vatex_code": "VATEX-EU-O",
"has_locations": false
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const headers = {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
};
// O cotă de impozitare este UN RÂND din setul de cote al unei clase, nu o taxă de sine stătătoare.
// Fiecare rând declară un domeniu (locații și/sau condiții pentru cumpărător), o categorie TVA EN16931
// (eu_vat_class) și o prioritate. La facturare, Enlivy alege rândul cu cea mai mare prioritate
// al cărui domeniu și cumpărător se potrivesc.
// Setul tipic pentru o categorie (țara de origine = România): patru modele.
//
// Intern, în țara de origine: implicit când vinzi în România
const result1 = await fetch(`${baseUrl}/organizations/${organizationId}/tax-rates` , {
method: "POST",
headers,
body: JSON.stringify({
organization_tax_class_id: "<standard_goods_class_id>",
has_eu_vat_properties: true,
is_compound: false,
is_inclusive: false,
name: "RO Domestic 21%",
rate: 21,
priority: 1000,
// Cotă standard, trecută pe linia de factură
eu_vat_class: "S",
has_locations: true,
locations: [{ country_code: "RO" }],
}),
}).then((response) => response.json());
// Taxare inversă UE B2B: 0%, se aplică DOAR firmelor înregistrate în scopuri de TVA din alte state UE
const result2 = await fetch(`${baseUrl}/organizations/${organizationId}/tax-rates` , {
method: "POST",
headers,
body: JSON.stringify({
organization_tax_class_id: "<standard_goods_class_id>",
has_eu_vat_properties: true,
is_compound: false,
is_inclusive: false,
name: "EU B2B Reverse Charge",
rate: 0,
priority: 900,
eu_vat_class: "AE",
// motivul scutirii (PEPPOL)
vatex_code: "VATEX-EU-AE",
// condiții pentru cumpărător
is_business_entity: true,
is_eu_vat_registered: true,
has_locations: true,
locations: [{ country_code: "DE" }, { country_code: "FR" }],
}),
}).then((response) => response.json());
// Intern pe țară în UE (B2C digital / OSS): aplici cota țării cumpărătorului
const result3 = await fetch(`${baseUrl}/organizations/${organizationId}/tax-rates` , {
method: "POST",
headers,
body: JSON.stringify({
organization_tax_class_id: "<standard_goods_class_id>",
has_eu_vat_properties: true,
is_compound: false,
is_inclusive: false,
name: "DE Domestic 19%",
rate: 19,
priority: 800,
eu_vat_class: "S",
has_locations: true,
locations: [{ country_code: "DE" }],
}),
}).then((response) => response.json());
// Restul lumii: în afara domeniului TVA, 0%, fără locații = regula de rezervă
const result4 = await fetch(`${baseUrl}/organizations/${organizationId}/tax-rates` , {
method: "POST",
headers,
body: JSON.stringify({
organization_tax_class_id: "<standard_goods_class_id>",
has_eu_vat_properties: true,
is_compound: false,
is_inclusive: false,
name: "Rest of World (Outside Scope)",
rate: 0,
priority: 100,
eu_vat_class: "O",
vatex_code: "VATEX-EU-O",
has_locations: false,
}),
}).then((response) => response.json());Ajustezi un singur rând: procentul, categoria de TVA, domeniul de aplicare sau prioritatea în ordinea în care se aleg cotele. Trimiți doar câmpurile pe care le schimbi.
/organizations/<organization_id>/tax-rates/<tax_rate_id> # Modifici un singur rând: procentul, categoria TVA, domeniul sau prioritatea.
# Trimiți doar câmpurile pe care le schimbi.
curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/tax-rates/<tax_rate_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"rate": 20,
"display_name": "VAT 20%"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const taxRateId = "<tax_rate_id>";
// Modifici un singur rând: procentul, categoria TVA, domeniul sau prioritatea.
// Trimiți doar câmpurile pe care le schimbi.
const result = await fetch(`${baseUrl}/organizations/${organizationId}/tax-rates/${taxRateId}` , {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// de exemplu, se schimbă cota internă din RO
rate: 20,
display_name: "VAT 20%",
}),
}).then((response) => response.json());Ștergi prin soft delete un singur rând din setul unei clase, de exemplu pentru o țară în care nu mai vinzi. Îl poți restaura ulterior.
/organizations/<organization_id>/tax-rates/<tax_rate_id> # ștergere reversibilă; restaurezi cu POST /tax-rates/restore/{taxRateId}
curl -X DELETE 'https://api.enlivy.com/organizations/<organization_id>/tax-rates/<tax_rate_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const taxRateId = "<tax_rate_id>";
// ștergere reversibilă; restaurezi cu POST /tax-rates/restore/{taxRateId}
const result = await fetch(`${baseUrl}/organizations/${organizationId}/tax-rates/${taxRateId}` , {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Referință API
Pipeline-ul de vânzări prin API
Integrezi direct cu Enlivy captarea clienților potențiali, CRM-ul și automatizările de vânzări. Prin API lucrezi cu pipeline-urile de vânzări: adaugi un prospect din orice sursă, îl muți prin etapele configurate și notezi fiecare interacțiune.
Exemplele de mai jos arată cum listezi și filtrezi clienții potențiali, cum adaugi unul nou, cum îl muți prin etapele configurate și cum înregistrezi activități precum apeluri și întâlniri. API-ul oferă și panouri, revizuirea și unificarea duplicatelor și un rezumat pe care îl poți descărca.
Aduci pipeline-ul în orice dashboard sau job de sincronizare. Listezi clienții potențiali cu paginare, filtrezi după etapă, responsabil, sursă sau interval de date și cauți full-text după nume, firmă sau email. Poți include în răspuns date legate, precum etapa curentă și membrul echipei căruia i-a fost atribuit.
/organizations/<organization_id>/prospects curl -G 'https://api.enlivy.com/organizations/<organization_id>/prospects' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'source_type=inbound' \
--data-urlencode 'include=organization_prospect_stage,assigned_organization_user' \
--data-urlencode 'include_meta=navigation' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const query = new URLSearchParams({
page: "1",
limit: "20",
source_type: "inbound",
include: "organization_prospect_stage,assigned_organization_user",
include_meta: "navigation",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/prospects?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Obții un singur prospect cu tot ce ține de el: datele de contact, sursa din care a venit, bugetul, etapa curentă din pipeline și momentele-cheie din ciclul de viață, precum data la care a fost calificat, câștigat sau pierdut.
/organizations/<organization_id>/prospects/<prospect_id> curl -G 'https://api.enlivy.com/organizations/<organization_id>/prospects/<prospect_id>' \
--data-urlencode 'include=organization_prospect_stage,assigned_organization_user' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const prospectId = "<prospect_id>";
const query = new URLSearchParams({
include: "organization_prospect_stage,assigned_organization_user",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/prospects/${prospectId}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Adaugi un client potențial din orice sursă: un landing page, o campanie de reclame, o listă de prospectare sau propria ta aplicație. Trimiți o persoană, o firmă sau pe amândouă, notezi de unde a venit și îl pui direct în pipeline.
/organizations/<organization_id>/prospects curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/prospects' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"first_name": "Jane",
"last_name": "Doe",
"company_name": "Acme Studio",
"email": "jane@acme.example",
"source_type": "inbound",
"source_channel": "website",
"source_campaign": "summer-launch",
"summary": "Requested a demo from the pricing page.",
"budget": "5000",
"budget_currency": "EUR"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/prospects` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
first_name: "Jane",
last_name: "Doe",
company_name: "Acme Studio",
email: "jane@acme.example",
source_type: "inbound",
source_channel: "website",
source_campaign: "summer-launch",
summary: "Requested a demo from the pricing page.",
budget: "5000",
budget_currency: "EUR",
}),
}).then((response) => response.json());Actualizezi datele de contact ale unui prospect, responsabilul, bugetul, rezumatul sau starea din ciclul de viață (calificat, descalificat, câștigat, pierdut). Trimiți doar câmpurile pe care vrei să le schimbi.
/organizations/<organization_id>/prospects/<prospect_id> curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/prospects/<prospect_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"summary": "Budget confirmed, decision expected next week.",
"budget": "8000",
"budget_currency": "EUR"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const prospectId = "<prospect_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/prospects/${prospectId}` , {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
summary: "Budget confirmed, decision expected next week.",
budget: "8000",
budget_currency: "EUR",
}),
}).then((response) => response.json());Muți un prospect pe un traseu de etape configurat. Fiecare avansare reține cine a făcut-o și poate avea un rezultat, o notă și un raport legat. Avansarea apare și în cronologia prospectului.
/organizations/<organization_id>/prospects/<prospect_id>/advance curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/prospects/<prospect_id>/advance' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_prospect_stage_path_id": "stage_path_id_here",
"outcome": "Qualified, budget and timeline confirmed.",
"description": "Moved from New to Qualified after the discovery call."
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const prospectId = "<prospect_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/prospects/${prospectId}/advance` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
organization_prospect_stage_path_id: "stage_path_id_here",
outcome: "Qualified, budget and timeline confirmed.",
description: "Moved from New to Qualified after the discovery call.",
}),
}).then((response) => response.json());Înregistrezi o interacțiune cu un prospect: un apel, o întâlnire, un email, o notă. Activitățile formează cronologia prospectului, iar echipa ta vede un istoric comun al tuturor interacțiunilor, în ordinea în care au avut loc.
/organizations/<organization_id>/prospect-activities curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/prospect-activities' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_prospect_id": "prospect_id_here",
"title": "Discovery call",
"description": "Walked through pricing and the onboarding timeline.",
"outcome": "Positive, sending a proposal next week.",
"activity_at": "2026-07-03 15:30:00"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/prospect-activities` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
organization_prospect_id: "prospect_id_here",
title: "Discovery call",
description: "Walked through pricing and the onboarding timeline.",
outcome: "Positive, sending a proposal next week.",
activity_at: "2026-07-03 15:30:00",
}),
}).then((response) => response.json());Citești fluxul de activități din toată organizația. Poți include în fiecare intrare prospectul de care ține, membrul echipei care a făcut-o și, dacă există, raportul sau trecerea între etape legate de ea.
/organizations/<organization_id>/prospect-activities curl -G 'https://api.enlivy.com/organizations/<organization_id>/prospect-activities' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'include=organization_prospect,performed_by_organization_user' \
--data-urlencode 'include_meta=navigation' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const query = new URLSearchParams({
page: "1",
limit: "20",
include: "organization_prospect,performed_by_organization_user",
include_meta: "navigation",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/prospect-activities?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Referință API
Contracte prin API
Redactezi, trimiți, semnezi și urmărești contracte de la un capăt la altul, fără ca utilizatorii tăi să iasă vreodată din aplicația ta. API-ul pentru contracte acoperă tot ciclul de viață: compui contractul din capitole și părți, îl treci prin statusurile definite de tine, deschizi pentru fiecare semnatar o sesiune de semnare cu valoare legală și descarci documentul semnat, împreună cu dovezile de audit, care nu pot fi modificate fără să se observe.
Lucrezi cu patru resurse: contractele (documentul, capitolele și părțile lui), statusurile de contract (etapele pe care le configurezi tu), sesiunile de semnare (câte una pentru fiecare parte, cu verificare prin email sau SMS) și istoricul de audit (jurnalele de trimitere și dovezile de semnare). Exemplele de mai jos parcurg tot fluxul.
Listezi contractele cu paginare, filtre detaliate și căutare full-text. Filtrezi după status, expeditor, destinatar, direcție (inbound / outbound), categorie (core, amendment, addenda, supplement), sursă (internal / uploaded), limbă, contract părinte sau oricare dintre intervalele de date (issued_at, ends_at, created_at, updated_at). Poți include în răspuns datele legate.
/organizations/<organization_id>/contracts # filtrele sunt opționale și se pot combina
# trimiți q=... în loc de ids pentru căutare în tot textul
curl -G 'https://api.enlivy.com/organizations/<organization_id>/contracts' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'direction=outbound' \
--data-urlencode 'category=core' \
--data-urlencode 'include=contract_status,sender_user,receiver_user,contract_parties' \
--data-urlencode 'include_meta=navigation' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// filtrele sunt opționale și se pot combina
// trimiți q=... în loc de ids pentru căutare în tot textul
const query = new URLSearchParams({
page: "1",
limit: "20",
direction: "outbound",
category: "core",
include: "contract_status,sender_user,receiver_user,contract_parties",
include_meta: "navigation",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contracts?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Obții un singur contract cu tot ce ține de el: capitolele, părțile, statusul curent, fișierul atașat și expeditorul / destinatarul.
/organizations/<organization_id>/contracts/<contract_id> # includes disponibile: organization, parent_contract, sender_user, receiver_user,
# file, contract_status, contract_chapters, contract_parties, contract_prefix
curl -G 'https://api.enlivy.com/organizations/<organization_id>/contracts/<contract_id>' \
--data-urlencode 'include=contract_chapters,contract_parties,contract_status' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const contractId = "<contract_id>";
// includes disponibile: organization, parent_contract, sender_user, receiver_user,
// file, contract_status, contract_chapters, contract_parties, contract_prefix
const query = new URLSearchParams({
include: "contract_chapters,contract_parties,contract_status",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contracts/${contractId}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Construiești un contract dintr-un singur apel: metadatele, conținutul sub formă de capitole ordonate și părțile. O parte poate fi o persoană fizică sau o organizație și precizează cum este numită în document și dacă semnătura ei este obligatorie.
/organizations/<organization_id>/contracts curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/contracts' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"category": "core",
"source": "internal",
"direction": "outbound",
"organization_sender_user_id": "<org_user_sender_id>",
"organization_receiver_user_id": "<org_user_receiver_id>",
"organization_contract_status_id": "<contract_status_id>",
"organization_contract_prefix_id": "<contract_prefix_id>",
"title": "Master Services Agreement",
"sub_title": "2026 Engagement",
"locale": "en",
"issued_at": "2026-07-03 09:00:00",
"ends_at": "2027-07-03 09:00:00",
"content_introduction": "This agreement is entered into between the parties below.",
"content_signature_disclaimer": "By signing, each party agrees to the terms above.",
"chapters": [
{
"title": "Scope of Work",
"content": "<p>The Provider will deliver…</p>",
"order": 1
},
{
"title": "Payment Terms",
"content": "<p>Fees are due within 14 days…</p>",
"order": 2
}
],
"parties": [
{
"party_type": "organization",
"party_country_code": "RO",
"organization_name": "Acme Studio SRL",
"organization_type": "srl",
"first_name": "Jane",
"last_name": "Doe",
"role_in_organization": "Administrator",
"referenced_as_within_document": "the Provider",
"appears_as_party": true,
"is_signature_required": true,
"contact_email_address": "jane@acme.example",
"order": 0
},
{
"party_type": "individual",
"party_country_code": "RO",
"first_name": "John",
"last_name": "Smith",
"referenced_as_within_document": "the Client",
"appears_as_party": true,
"is_signature_required": true,
"contact_email_address": "john@example.com",
"order": 1
}
]
}' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contracts` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// core | amendment | addenda | supplement.
// amendment/addenda/supplement CER organization_contract_id -> un contract părinte "core".
category: "core",
// internal -> numerotat automat dintr-un prefix (organization_contract_prefix_id obligatoriu mai jos)
// uploaded -> trimiți tu `number` și poți seta `signed_by_all_parties_at`
source: "internal",
// outbound | inbound
direction: "outbound",
organization_sender_user_id: "<org_user_sender_id>",
organization_receiver_user_id: "<org_user_receiver_id>",
organization_contract_status_id: "<contract_status_id>",
// obligatoriu doar pentru internal + core; îl omiți pentru orice altă sursă sau categorie
organization_contract_prefix_id: "<contract_prefix_id>",
title: "Master Services Agreement",
sub_title: "2026 Engagement",
locale: "en",
issued_at: "2026-07-03 09:00:00",
ends_at: "2027-07-03 09:00:00",
content_introduction: "This agreement is entered into between the parties below.",
content_signature_disclaimer: "By signing, each party agrees to the terms above.",
chapters: [
{
title: "Scope of Work",
content: "<p>The Provider will deliver…</p>" ,
order: 1,
},
{
title: "Payment Terms",
content: "<p>Fees are due within 14 days…</p>" ,
order: 2,
},
],
parties: [
// se acceptă și blocurile JSON specifice țării, `information` (persoană) și `organization_information`
// (companie); forma lor e validată după schema țării.
{
// party_type, party_country_code, first_name, last_name sunt obligatorii pentru fiecare parte
// organization | individual
party_type: "organization",
party_country_code: "RO",
// părțile de tip organization CER în plus organization_name + organization_type
organization_name: "Acme Studio SRL",
// valoarea vine din datele de referință
organization_type: "srl",
first_name: "Jane",
last_name: "Doe",
role_in_organization: "Administrator",
referenced_as_within_document: "the Provider",
appears_as_party: true,
is_signature_required: true,
contact_email_address: "jane@acme.example",
order: 0,
},
{
party_type: "individual",
party_country_code: "RO",
first_name: "John",
last_name: "Smith",
referenced_as_within_document: "the Client",
appears_as_party: true,
is_signature_required: true,
contact_email_address: "john@example.com",
order: 1,
},
],
}),
}).then((response) => response.json());Actualizezi metadatele unui contract, îl muți în alt status, îi ajustezi capitolele sau îi modifici părțile. Trimiți doar ce vrei să schimbi.
/organizations/<organization_id>/contracts/<contract_id> curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/contracts/<contract_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_contract_status_id": "<next_status_id>",
"sub_title": "2026 Engagement (revised)",
"ends_at": "2027-12-31 23:59:59"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const contractId = "<contract_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contracts/${contractId}` , {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// actualizare parțială: se modifică doar câmpurile trimise
organization_contract_status_id: "<next_status_id>",
sub_title: "2026 Engagement (revised)",
ends_at: "2027-12-31 23:59:59",
}),
}).then((response) => response.json());Generezi și descarci contractul ca PDF, exact documentul pe care îl văd și celelalte părți.
/organizations/<organization_id>/contracts/<contract_id>/download # primești un fișier: îl citești ca blob, nu ca JSON
curl 'https://api.enlivy.com/organizations/<organization_id>/contracts/<contract_id>/download' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
--remote-name --remote-header-nameconst baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const contractId = "<contract_id>";
// primești un fișier: îl citești ca blob, nu ca JSON
const pdf = await fetch(`${baseUrl}/organizations/${organizationId}/contracts/${contractId}/download` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
}).then((response) => response.blob());Ștergi un contract prin soft delete, așa că îl poți restaura ulterior.
/organizations/<organization_id>/contracts/<contract_id> # ștergere reversibilă; restaurezi cu POST /contracts/restore/{contractId}
curl -X DELETE 'https://api.enlivy.com/organizations/<organization_id>/contracts/<contract_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const contractId = "<contract_id>";
// ștergere reversibilă; restaurezi cu POST /contracts/restore/{contractId}
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contracts/${contractId}` , {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Contractele trec prin etapele tale, nu printr-un flux fix. Fiecare status corespunde unei stări din ciclul de viață (draft, action_required, accepted, breach sau terminated) și are etichete traduse, o culoare și un număr de ordine. Un status se aplică pe direcția inbound, outbound sau pe oricare (any). Le listezi ca să construiești un panou sau să alimentezi automatizări.
/organizations/<organization_id>/contract-statuses curl -G 'https://api.enlivy.com/organizations/<organization_id>/contract-statuses' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=50' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const query = new URLSearchParams({
page: "1",
limit: "50",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contract-statuses?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Definești o etapă nouă. Etichetele și descrierile se trimit pe limbi (câte un text pentru fiecare limbă), contract_state leagă etapa de o stare din ciclul de viață și poți muta automat contractul în alt status după ce o acțiune reușește.
/organizations/<organization_id>/contract-statuses curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/contract-statuses' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"title_lang_map": {
"en": "Awaiting Signature",
"ro": "În așteptarea semnării"
},
"description_lang_map": {
"en": "Sent to all parties for signing.",
"ro": "Trimis către toate părțile pentru semnare."
},
"contract_state": "action_required",
"direction": "any",
"order": 3,
"rgba_color_code": "rgba(59, 130, 246, 1)"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contract-statuses` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// hărți pe limbi, nu texte simple
title_lang_map: {
en: "Awaiting Signature",
ro: "În așteptarea semnării",
},
description_lang_map: {
en: "Sent to all parties for signing.",
ro: "Trimis către toate părțile pentru semnare.",
},
// draft | action_required | accepted | breach | terminated
contract_state: "action_required",
// inbound | outbound | any
direction: "any",
// order este unic în organizație: alegi un loc liber
// sau reordonezi etapele existente cu PUT /contract-statuses/reorder
order: 3,
rgba_color_code: "rgba(59, 130, 246, 1)",
}),
}).then((response) => response.json());Creezi câte o sesiune de semnare pentru fiecare parte care trebuie să semneze. Alegi tipurile de semnătură acceptate (desenată, bifă, fișier clasic, fișier electronic), confirmările obligatorii (email, telefon, acceptarea valorii legale a semnăturii) și data de expirare. Cu signature_source user_flow, Enlivy găzduiește semnarea, cu pași ghidați pentru semnatar, și returnează un URL de semnare cu token.
/organizations/<organization_id>/contract-signatures curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/contract-signatures' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_contract_id": "<contract_id>",
"organization_contract_party_id": "<party_id>",
"signature_source": "user_flow",
"sign_session_signature_types": [
"draw",
"checkbox"
],
"sign_session_required_confirmations": [
"email",
"legally_binding"
],
"expires_at": "2026-07-17 23:59:59"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contract-signatures` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
organization_contract_id: "<contract_id>",
// o singură sesiune activă pe parte; organization_contract_party_id este unic
organization_contract_party_id: "<party_id>",
// user_flow -> Enlivy găzduiește semnarea (linkul vine din sign_session_url)
// admin_panel -> înregistrezi tu semnătura și poți trimite is_signed / signature_drawing / signed_contract
signature_source: "user_flow",
sign_session_signature_types: [
"draw",
// draw | checkbox | file_classic | file_electronic
"checkbox",
],
sign_session_required_confirmations: [
"email",
// email | phone | legally_binding
"legally_binding",
],
expires_at: "2026-07-17 23:59:59",
}),
}).then((response) => response.json());Trimiți sesiunea de semnare părții respective prin email sau SMS, cu un mesaj personalizat opțional. Fiecare trimitere rămâne în jurnalul de notificări, pentru audit.
/organizations/<organization_id>/contract-signatures/<contract_signature_id>/send curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/contract-signatures/<contract_signature_id>/send' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"method": "email",
"message": "Please review and sign the agreement by Friday."
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const contractSignatureId = "<contract_signature_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contract-signatures/${contractSignatureId}/send` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// email | sms
method: "email",
message: "Please review and sign the agreement by Friday.",
}),
}).then((response) => response.json());Verifici periodic o sesiune: statusul, dacă e semnată, când expiră și ce dovezi există. Incluzi sign_session_url ca să primești linkul de semnare găzduit de Enlivy, pe care i-l dai semnatarului.
/organizations/<organization_id>/contract-signatures/<contract_signature_id> # sign_session_url întoarce linkul găzduit pe care îl dai semnatarului.
# status este unul dintre: pending | sent | completed | expired | void
curl -G 'https://api.enlivy.com/organizations/<organization_id>/contract-signatures/<contract_signature_id>' \
--data-urlencode 'include=sign_session_url,organization_contract' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const contractSignatureId = "<contract_signature_id>";
// sign_session_url întoarce linkul găzduit pe care îl dai semnatarului.
// status este unul dintre: pending | sent | completed | expired | void
const query = new URLSearchParams({
include: "sign_session_url,organization_contract",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contract-signatures/${contractSignatureId}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Listezi toate sesiunile de semnare, opțional doar pentru un contract. E cel mai rapid mod de a vedea, pentru toate părțile, cine a semnat și cine încă nu.
/organizations/<organization_id>/contract-signatures # omiți organization_contract_id ca să vezi sesiunile tuturor contractelor
curl -G 'https://api.enlivy.com/organizations/<organization_id>/contract-signatures' \
--data-urlencode 'organization_contract_id=<contract_id>' \
--data-urlencode 'include=sign_session_url' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// omiți organization_contract_id ca să vezi sesiunile tuturor contractelor
const query = new URLSearchParams({
organization_contract_id: "<contract_id>",
include: "sign_session_url",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/contract-signatures?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Descarci pachetul de dovezi (autentificarea, consimțământul și datele biometrice ale semnăturii, captate la semnare), protejat astfel încât orice modificare să se vadă. Îl folosești pentru conformitate și în caz de dispută.
/organizations/<organization_id>/contracts/<contract_id>/download-evidence # disponibil și pe fiecare sesiune: /contract-signatures/{signatureId}/download-evidence
curl 'https://api.enlivy.com/organizations/<organization_id>/contracts/<contract_id>/download-evidence' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
--remote-name --remote-header-nameconst baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const contractId = "<contract_id>";
// disponibil și pe fiecare sesiune: /contract-signatures/{signatureId}/download-evidence
const evidence = await fetch(`${baseUrl}/organizations/${organizationId}/contracts/${contractId}/download-evidence` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
}).then((response) => response.blob());Referință API
Produse prin API
Îți sincronizezi catalogul din propriile sisteme. Prin API administrezi produsele pe care le vinzi și le refolosești pe documente (servicii, produse digitale, produse fizice și bonusuri), fiecare cu prețuri în mai multe monede, denumiri pe limbi, clasă de impozitare și metadatele necesare pentru facturarea electronică conformă. Produsele create aici le folosești direct în facturi, propuneri și planuri de plată.
Exemplele de mai jos acoperă operațiile de bază: listarea și căutarea produselor, crearea, modificarea și ștergerea unui produs.
Listezi produsele din catalog cu paginare, filtre și căutare full-text. Filtrezi după nume sau descriere, ceri anumite id-uri și poți include în răspuns clasa de impozitare.
/organizations/<organization_id>/products # filtre: name, description, ids (sau q=... pentru căutare în tot textul)
# includes: organization, tax_class, tag_ids, deleted_by_user
curl -G 'https://api.enlivy.com/organizations/<organization_id>/products' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'name=Consulting' \
--data-urlencode 'include=tax_class' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// filtre: name, description, ids (sau q=... pentru căutare în tot textul)
// includes: organization, tax_class, tag_ids, deleted_by_user
const query = new URLSearchParams({
page: "1",
limit: "20",
name: "Consulting",
include: "tax_class",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/products?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Adaugi un produs în catalog. Un produs are nevoie de un tip (type) și de un price_map; restul (denumirile pe limbi, clasa de impozitare, codurile de bare și metadatele pentru facturarea electronică) este opțional.
/organizations/<organization_id>/products curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/products' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"type": "service",
"price_map": {
"EUR": "49.90",
"USD": "54.00"
},
"primary_currency": "EUR",
"name_lang_map": {
"en": "Consulting Hour",
"ro": "Oră de consultanță"
},
"unit_code": "HUR",
"description_lang_map": {
"en": "One hour of advisory services."
},
"alias": "consulting-hour",
"organization_tax_class_id": "<tax_class_id>",
"is_sold": true,
"invoice_schema_map": {
"classification_identifier_cpv": "79411000-8",
"peppol_billing_unit_code": "HUR"
},
"ean_number": null,
"upc_number": null,
"stripe_product_id_list": [
"prod_XXXXXXXX"
]
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/products` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// obligatoriu: digital | physical | service | bonus
type: "service",
// obligatoriu: o hartă { monedă: sumă } (sume cu cel mult 2 zecimale).
// Cu 2 sau mai multe monede, primary_currency devine obligatoriu.
price_map: {
EUR: "49.90",
USD: "54.00",
},
primary_currency: "EUR",
// hărți pe limbi (nu texte simple)
name_lang_map: {
en: "Consulting Hour",
ro: "Oră de consultanță",
},
// codul de unitate Peppol, 3 caractere: HUR pentru oră, H87 pentru bucată
unit_code: "HUR",
description_lang_map: { en: "One hour of advisory services." },
// opțional; unic în organizație (litere, cifre, cratime)
alias: "consulting-hour",
organization_tax_class_id: "<tax_class_id>",
// dacă produsul se vinde acum
is_sold: true,
// metadate opționale pentru e-factură (folosite când produsul ajunge pe o linie de factură)
invoice_schema_map: {
// cod CPV
classification_identifier_cpv: "79411000-8",
// cod de unitate PEPPOL
peppol_billing_unit_code: "HUR",
},
// identificatori opționali
ean_number: null,
upc_number: null,
stripe_product_id_list: [
// fiecare id trebuie să înceapă cu "prod_"
"prod_XXXXXXXX",
],
}),
}).then((response) => response.json());Actualizezi orice parte a unui produs: îi schimbi prețul, denumirea sau clasa de impozitare ori stabilești dacă mai este de vânzare. Trimiți doar câmpurile pe care vrei să le schimbi.
/organizations/<organization_id>/products/<product_id> curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/products/<product_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"price_map": {
"EUR": "59.90",
"USD": "64.00"
},
"primary_currency": "EUR",
"name_lang_map": {
"en": "Consulting Hour, Senior"
},
"is_sold": false
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const productId = "<product_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/products/${productId}` , {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// preț nou: price_map îl înlocuiește pe cel salvat
price_map: {
EUR: "59.90",
USD: "64.00",
},
primary_currency: "EUR",
name_lang_map: { en: "Consulting Hour, Senior" },
is_sold: false,
}),
}).then((response) => response.json());Ștergi un produs prin soft delete, ca să nu mai fie oferit. Îl poți restaura ulterior.
/organizations/<organization_id>/products/<product_id> # ștergere reversibilă; restaurezi cu POST /products/restore/{productId}
curl -X DELETE 'https://api.enlivy.com/organizations/<organization_id>/products/<product_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const productId = "<product_id>";
// ștergere reversibilă; restaurezi cu POST /products/restore/{productId}
const result = await fetch(`${baseUrl}/organizations/${organizationId}/products/${productId}` , {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Referință API
Sesiuni de autentificare prin API
Creezi și citești, direct din API-ul de administrare, sesiuni de autentificare în portalul clienților pentru utilizatorii tăi. O sesiune îi dă unui utilizator al organizației tale acces la aplicația pentru clienți (portalul), doar la ce alegi tu și pentru o perioadă limitată. Utilizatorul se autentifică prin email, telefon sau un link magic. Găsești utilizatorul, deschizi o sesiune (după id sau după email), apoi o citești.
Obții utilizatorii pentru care poți deschide o sesiune. Filtrezi după email, faci o căutare full-text sau parcurgi toată lista, pagină cu pagină, până găsești persoana potrivită.
/organizations/<organization_id>/users # filtre: email, created_at_from/to, updated_at_from/to, ids, sau q=... pentru căutare în text
curl -G 'https://api.enlivy.com/organizations/<organization_id>/users' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'email=jane@acme.example' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// filtre: email, created_at_from/to, updated_at_from/to, ids, sau q=... pentru căutare în text
const query = new URLSearchParams({
page: "1",
limit: "20",
email: "jane@acme.example",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/users?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Deschizi o sesiune pentru un anumit utilizator, pe baza organization_user_id. Cererea vizează o singură identitate, așa că sesiunea trece direct la autentificare, fără nicio ambiguitate.
/organizations/<organization_id>/user-client-portal-sessions curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/user-client-portal-sessions' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_user_id": "<org_user_id>",
"name": "Jane Doe",
"authentication_method": "email",
"permissions": [
"invoices",
"receipts",
"payment_methods"
],
"validity_hours": 72
}'
# Răspunsul conține: token, status, magic_authentication_url (pentru magic_authentication),
# authentication_verification_code (pentru email / phone), permissions, expires_at. const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/user-client-portal-sessions` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// indici exact identitatea utilizatorului
organization_user_id: "<org_user_id>",
// obligatoriu: numele afișat pentru sesiune
name: "Jane Doe",
// cum își confirmă utilizatorul identitatea: email | phone | magic_authentication
authentication_method: "email",
// ce poate accesa sesiunea în portal
// opțiuni: invoices | receipts | network_exchanges | contracts | reports | payment_methods
permissions: [
"invoices",
"receipts",
"payment_methods",
],
// durata: setezi validity_hours SAU expires_at (limitate de maximul serverului)
validity_hours: 72,
}),
}).then((response) => response.json());
// Răspunsul conține: token, status, magic_authentication_url (pentru magic_authentication),
// authentication_verification_code (pentru email / phone), permissions, expires_at. Deschizi o sesiune după email în loc de id, util când știi doar adresa. Dacă emailul aparține unui singur utilizator, sesiunea continuă direct. Dacă aceeași adresă aparține mai multor identități, sesiunea este creată în starea awaiting_user_selection, iar portalul îi cere utilizatorului să aleagă cu ce identitate se autentifică, înainte să continue.
/organizations/<organization_id>/user-client-portal-sessions curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/user-client-portal-sessions' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"email": "jane@acme.example",
"name": "Jane Doe",
"authentication_method": "email",
"permissions": [
"invoices",
"receipts",
"payment_methods"
],
"validity_hours": 72
}'
# O singură potrivire -> sesiunea trece la autentificare.
# Mai multe potriviri -> status "awaiting_user_selection"; utilizatorul alege în portal
# identitatea cu care se autentifică, apoi continuă.const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/user-client-portal-sessions` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// indici utilizatorul prin email
email: "jane@acme.example",
// obligatoriu: numele afișat pentru sesiune
name: "Jane Doe",
// cum își confirmă utilizatorul identitatea: email | phone | magic_authentication
authentication_method: "email",
// ce poate accesa sesiunea în portal
// opțiuni: invoices | receipts | network_exchanges | contracts | reports | payment_methods
permissions: [
"invoices",
"receipts",
"payment_methods",
],
// durata: setezi validity_hours SAU expires_at (limitate de maximul serverului)
validity_hours: 72,
}),
}).then((response) => response.json());
// O singură potrivire -> sesiunea trece la autentificare.
// Mai multe potriviri -> status "awaiting_user_selection"; utilizatorul alege în portal
// identitatea cu care se autentifică, apoi continuă. Citești o sesiune: starea curentă, când a fost folosită ultima dată, când expiră și utilizatorul căruia îi aparține. Verifici periodic starea ca să vezi cum trece utilizatorul prin autentificare (inclusiv alegerea identității, când sesiunea a fost deschisă după email).
/organizations/<organization_id>/user-client-portal-sessions/<user_client_portal_session_id> # includes: organization_user, organization
curl -G 'https://api.enlivy.com/organizations/<organization_id>/user-client-portal-sessions/<user_client_portal_session_id>' \
--data-urlencode 'include=organization_user' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json'
# status: pending | email_verification_sent | awaiting_user_selection | success | expiredconst baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const userClientPortalSessionId = "<user_client_portal_session_id>";
// includes: organization_user, organization
const query = new URLSearchParams({
include: "organization_user",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/user-client-portal-sessions/${userClientPortalSessionId}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());
// status: pending | email_verification_sent | awaiting_user_selection | success | expired Funcționează împreună cu
- Date din conturi bancare Fiecare cont conectat, cu soldul și tranzacțiile lui, în același dashboard: sincronizat în siguranță, ținut la zi și legat de restul evidențelor tale.
- Tranzacții bancare Aduci toate tranzacțiile în Enlivy: sincronizate din bancă, importate dintr-un fișier sau introduse de mână. Apoi legi fiecare tranzacție de factura, chitanța sau fluturașul de salariu de care ține, ca să vezi fiecare plată lângă documentul pe care îl achită.
- Pachete comerciale Creezi o singură dată un pachet comercial și îl vinzi săptămânal, lunar, anual sau la orice interval dintre ele. Clienții se abonează și își administrează cardul dintr-un portal cu brandul tău, iar dacă le permiți, schimbă ciclul sau nivelul, suspendă ori anulează abonamentul. Cu pachetul Plăți recurente, Enlivy facturează fiecare ciclu, iar plățile cu cardul se încasează prin contul tău Stripe.
- Billing Schedules Configurezi un abonament, un onorariu lunar sau o plată în rate, îi legi facturile și chitanțele și vezi exact cât s-a plătit, ce mai e de plătit și cum stai cu fiecare client sau furnizor.
- Contracte Redactezi contracte din șabloane, le trimiți la semnat cu verificarea identității prin SMS sau email și urmărești fiecare semnătură și fiecare reînnoire.
- Portal clienți Un portal self-service cu logoul firmei tale, pe domeniul tău dacă îl adaugi, în care clienții acceptă singuri propuneri, plătesc facturi, își administrează abonamentele și semnează contracte. Fiecare acțiune apare în Enlivy, pe fișa clientului.
- Export de date Exporți facturile, chitanțele, fluturașii de salariu, contractele și tranzacțiile în formatul și structura de foldere la care se așteaptă contabilul, pentru orice perioadă. Inclus în orice plan, fără cost suplimentar.
- Dashboard Vezi munca și cifrele care contează pentru tine, apoi îți personalizezi dashboardul: adaugi și aranjezi widgeturile disponibile.
- Preluare documente Pornești de la un document, alegi unde îi e locul și verifici formularul. O citire AI, dacă o ceri, poate sugera detaliile documentului.
- Pontaj Cine a fost angajat, în ce condiții, în ce țară, ce a făcut în fiecare zi și cât timp trebuie păstrată fiecare dintre aceste informații. Enlivy ține raportul de muncă ca pe o evidență propriu-zisă, cu regulile din jurisdicția persoanei, nu din adresa firmei tale.
- Ghiduri Scrii bunele practici și regulile firmei, iar echipa rămâne pe aceeași linie, cu ghiduri clare și ușor de găsit.
- Helpdesk Rezolvi întrebările venite din widgetul de pe site și dintr-o căsuță de email conectată prin IMAP: atribui un coleg, răspunzi cu tot contextul și ții deoparte, pentru verificare, emailurile de la expeditori necunoscuți.
- Facturi Emiți factura, o trimiți clientului și o legi de contractul, chitanța sau tranzacția bancară de care ține. Facturile către clienții din România le trimiți în e-Factura prin conexiunea ANAF configurată.
- MCP Conectezi Enlivy la Claude, ChatGPT, Cursor sau orice alt asistent AI prin MCP. Întrebi despre facturi, contracte și pipeline și rezolvi lucruri concrete, în siguranță, fără să depășești ce poate face deja contul tău.
- Network Exchanges Dacă firma ta e din România, conectezi ANAF eFactura: primești facturile de la furnizori și trimiți facturile emise către clienții din România, manual sau după un program pe care îl configurezi. Starea fiecărui schimb o vezi în Enlivy. Pentru alte piețe, descarci fișierul de factură electronică într-un format acceptat, îl verifici și îl depui separat.
- Fluturași de salariu Cifrele le calculează contabilul tău. În Enlivy le înregistrezi: fiecare sumă pe linia ei codificată, cu termenii folosiți în țara ta, verificată cu totalurile fluturașului. Fluturașul e legat de raportul de muncă, de contractul și de plata lui.
- Playbook-uri Scrii, aplici și îmbunătățești proceduri pas cu pas pentru orice flux de lucru. Sarcinile care se repetă se fac la fel de fiecare dată, cu mai puține erori, pentru că echipa are în față pași clari.
- Produse Îți faci un catalog cu tot ce vinzi, servicii sau bunuri, cu prețul, unitatea, taxele și descrierea completate o singură dată. Apoi adaugi orice produs pe o ofertă sau o factură în câteva secunde.
- Pipeline de vânzări Afli ce oportunități merg mai departe, recitești discuția înainte să revii la client și ții propunerile aproape de vânzare.
- Chitanțe Înregistrezi banii încasați și pe cei plătiți, păstrezi la un loc documentele justificative și, când e nevoie, legi chitanța de factura sau contractul de care ține.
- Rapoarte În loc de mesaje pe chat și email, echipa ta completează rapoarte structurate. Stabilești o singură dată întrebările și ritmul așteptat, într-o schemă pe care o refolosești și la care le dai acces celor care trebuie să răspundă. Fiecare raport trimis ajunge în Enlivy, gata de comparat.
- Integrare Slack Nu mai verifica dashboard-urile ca să afli ce s-a schimbat. Enlivy îți aduce în Slack momentele importante, de la plăți și propuneri până la conversațiile din Helpdesk. Te conectezi o dată, alegi evenimentele și le trimiți pe canalele potrivite.
- Taxe Nu mai alegi manual cota de TVA. Atribui o clasă de impozitare unui produs sau unei linii de factură, iar Enlivy aplică automat cota corectă, după cine e clientul și unde se află. Codurile UE pentru facturarea electronică sunt deja incluse.
- Sarcini Păstrezi munca echipei lângă factura, proiectul sau prospectul de care ține. Modulul Sarcini e inclus în orice organizație, fără cost suplimentar: nu plătești un abonament separat și nu ai limită de sarcini.
- Utilizatori În Enlivy îți adaptezi ușor rolurile și permisiunile pentru clienți, parteneri, contabili și administratori, ca accesul fiecăruia să fie sigur și eficient.
- Webhooks La câteva clipe după ce se întâmplă ceva în Enlivy (o factură e plătită, intră o tranzacție, se schimbă un utilizator), un webhook anunță sistemul tău. Reacționezi la evenimente, în loc să verifici periodic dacă s-a schimbat ceva sau să aștepți rapoarte.