Integrează-ți Sistemele și Automatizează Fluxurile cu API-ul Enlivy
Orice acțiune din dashboard-ul Enlivy o poți face și prin API: creezi facturi, sincronizezi contracte, actualizezi înregistrări, miști date financiare. Construiești automatizări și conectezi Enlivy la restul stack-ului tău, cu documentație clară și fără vendor lock-in.
Începe AziAPI-FIRST PRIN DESIGN
Creat pentru Developeri. Pregătit pentru Afaceri.
Tot ce poți face în Enlivy, poți face și prin API.
Orice acțiune din interfață, de la crearea facturilor până la sincronizarea contractelor sau actualizarea înregistrărilor, poate fi realizată prin API. Automatizează sarcinile repetitive, conectează Enlivy cu sistemele tale existente și creează fluxuri care se potrivesc cu modul în care funcționează afacerea ta.
Endpointuri curate și fiabile, cu documentație clară și fără vendor lock-in. Fie că ești startup sau o firmă mare, livrezi automatizări și integrări în zile, nu în luni.
-
Modular prin design
Conectezi doar ce ai nevoie: facturi, clienți, contracte și altele, fără să fii prins într-un sistem rigid.
-
Construiește rapid, scalează inteligent
Un API rapid și stabil îți lasă echipa să creeze automatizări și integrări în zile, nu luni.
-
Se integrează cu sistemele tale
Conectezi Enlivy la sistemele de HR, finanțe și CRM pe care le folosești deja.
-
Fără vendor lock-in
Endpointuri curate și documentate, pe care le controlezi tu, cu flexibilitate totală.
SUNĂ FAMILIAR?
Provocările Care Îți Încetinesc Afacerea
Integrări fragile și muncă manuală, lucrurile care împiedică o afacere să crească. Iată ce te costă și cum schimbă asta o platformă API-first.
- Problema
Sisteme care nu comunică
Să-ți conectezi HR-ul, finanțele și CRM-ul e un ghem frustrant de muncă manuală și integrări nesigure.
Fiecare înregistrare e accesibilă printr-un singur API curat, așa că sistemele tale se conectează în sfârșit și rămân sincronizate.
- Problema
Muncă manuală care nu scalează
Sarcinile manuale repetitive scad productivitatea, cresc erorile și îți blochează capacitatea de a scala cu încredere.
Automatizezi munca repetitivă, facturare și sincronizare de date, și o lași pe seama automatizării, fără erori, pe măsură ce crești.
Referință API
Gestionarea Facturilor prin API
Integrează direct cu Enlivy prin API-ul public pentru acces programatic la datele contului tău: facturi, chitanțe, tranzacții, produse, utilizatori, contracte și altele.
Exemplele de mai jos acoperă cele mai comune operațiuni cu facturile: listarea facturilor, accesarea unei singure facturi, crearea uneia noi și actualizarea datelor existente.
Interoghează facturile organizației tale folosind paginare, filtre și metadata. Poți extinde detalii precum articolele din factură și taxele aplicate.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/invoices?page=1&limit=20&include=invoice_prefix,tag_ids,line_items,taxes&include_meta=navigation`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
}); Recuperează informații detaliate despre o factură specifică din cadrul organizației tale. Folosește această funcție pentru a accesa date precum totaluri, articole din factură, stadiu, taxe, etichete și altele.
const organizationId = "your_org_id";
const invoiceId = "your_invoice_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/invoices/${invoiceId}?include=invoice_prefix,tag_ids,line_items,taxes`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
}); Creează o factură nouă în cadrul organizației tale. Poți include detalii precum utilizatorii expeditor și destinatar, prefixul facturii, moneda, articolele facturate și altele.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/invoices`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: 'your_payload'
}); Modifică detalii precum statusul (de exemplu: emisă, plătită, anulată), metoda de plată, data scadenței, numărul facturii, etichetele, notele și liniile de produse.
const organizationId = "your_org_id";
const invoiceId = "existing_invoice_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/invoices/${invoiceId}`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: 'your_payload'
}); Referință API
Programe de Facturare prin API
Automatizează veniturile recurente de la un capăt la altul. Un program de facturare app-managed este rulat integral de Enlivy: generează facturi pe cadența pe care o definești, taxează metoda de plată salvată, reîncearcă eșecurile și trece prin propriul său ciclu de viață: pending, active, paused, cancelling, completed. Definești compoziția o singură dată; motorul o facturează după program.
Această referință acoperă doar programele app-managed. Enlivy suportă și programe găzduite de Stripe, unde Stripe deține abonamentul și rulează facturarea. Acelea sunt gestionate pe partea Stripe, așa că crearea și modificarea lor nu sunt acoperite aici. Poți compune un program app-managed în două moduri: din faze brute (propriile tale linii recurente și cadență) sau dintr-un pachet de facturare cu abonament (un șablon reutilizabil). Exemplele de mai jos acoperă ambele, plus listare, editare, reconfigurare și anulare.
Interoghează programele cu paginare, filtrare și căutare full-text. Filtrează după status, direcție (emise / primite), expeditor, destinatar, contract, cont bancar sau oricare dintre intervalele de date (starts_at, ends_at, created_at, updated_at). Extinde fazele și plățile generate inline.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/billing-schedules?page=1&limit=20` +
// status: pending | active | payment_method_required | paused | cancelling | completed | cancelled
`&status=active&direction=outbound` +
`&include=receiver_user,phases,payments` +
`&include_meta=navigation`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Recuperează un singur program cu tot ce este atașat: fazele și liniile sale, plățile generate până acum, părțile implicate și pachetul sau contractul asociat. Citește next_payment_create_at ca să vezi când facturează motorul următoarea dată, și total / paid_total pentru progres.
const organizationId = "your_org_id";
const scheduleId = "your_schedule_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/billing-schedules/${scheduleId}` +
// includes: sender_user, receiver_user, contract, billing_package,
// subscription_term, phases, payments, deleted_by_user
`?include=phases,payments,receiver_user,billing_package`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Cel mai direct mod de a factura: definește una sau mai multe faze, fiecare cu propria cadență și linii. Motorul emite o factură per apariție a fazei și o taxează. Fazele sunt exclusive programelor app-managed.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/billing-schedules`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
management_type: "app_managed", // this reference only covers app_managed
direction: "outbound", // outbound = you bill a customer; inbound = you are billed
status: "active", // start billing right away
organization_sender_user_id: "org_user_sender_id", // the biller (you)
organization_receiver_user_id: "org_user_receiver_id", // the customer (required for outbound)
currency: "EUR",
payment_method: "stripe_card_payment", // bank_transfer | card_payment | stripe_card_payment | paypal | cash | paid_by_personal_funds
organization_user_payment_method_id: "payment_method_id", // saved card to auto-charge (must belong to the receiver)
name_lang_map: { en: "Monthly Retainer" }, // per-locale maps, not plain strings
note_lang_map: { en: "Includes support and hosting." },
is_email_notifications_active: true,
email_notifications_to: "billing@acme.example",
// customer self-service toggles (what the recipient may do from the portal)
customer_can_reconfigure: false,
customer_can_cancel: true,
customer_can_pause: false,
// totals + dates (total, paid_total, starts_at, ends_at, next_payment_create_at)
// are computed by the engine, do NOT send them.
// phases are valid ONLY for app_managed (stripe_hosted rejects them). Max 20.
phases: [
{
frequency: "monthly", // weekly | biweekly | monthly | yearly
execute_after: "2026-08-01", // first run date for this phase
max_occurrences: 12, // stop after N invoices (omit for open-ended)
due_date_type: "custom_days", // immediate | end_of_month | custom_days
due_date_days: 14, // required only when due_date_type = custom_days
order: 0,
line_items: [
{
name_lang_map: { en: "Retainer" }, // required unless organization_product_id is set
quantity: 1,
price: 500.00, // money: signed decimal in MAJOR units (not cents)
organization_tax_class_id: "tax_class_id"
},
{
organization_product_id: "product_id", // pulls name / tax defaults from the product
quantity: 2,
price: 49.90
}
]
}
]
})
}); În loc să construiești fazele manual, materializează programul dintr-un pachet de facturare cu abonament reutilizabil. Pachetul deține compoziția, tu doar alegi varianta de cadență și ce elemente din grup să incluzi.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/billing-schedules`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
management_type: "app_managed", // package-managed requires app_managed
direction: "outbound", // package-managed requires outbound
status: "active",
organization_sender_user_id: "org_user_sender_id",
organization_receiver_user_id: "org_user_receiver_id",
organization_user_payment_method_id: "payment_method_id",
// attach a SUBSCRIPTION package, it defines the phases & line items
organization_billing_package_id: "billing_package_id",
// optional: pick the cadence variant; omit to use the package default
organization_billing_package_subscription_term_id: "subscription_term_id",
// optional: choose which package group items (and quantities) to include
selected_group_items: [
{ id: "group_item_id_1", quantity: 1 },
{ id: "group_item_id_2", quantity: 3 }
]
// NOTE: mutually exclusive with `phases`, the package supplies them.
})
}); Actualizează metadatele (nume, note, setări de notificare, opțiuni de self-service) și controlează ciclul de viață mutând status: pune pe pauză un program activ, reia unul pus pe pauză sau setează-l să se anuleze. Trimiți doar ce vrei să schimbi.
const organizationId = "your_org_id";
const scheduleId = "your_schedule_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/billing-schedules/${scheduleId}`, {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
// lifecycle: active <-> paused; set "cancelling" to stop at the end of the cycle
status: "paused",
note_lang_map: { en: "Paused at customer request." },
is_email_notifications_active: false,
customer_can_cancel: true
// to change WHAT gets billed on a package-managed schedule,
// use /reconfigure below rather than editing here.
})
}); Schimbă ce facturează un program bazat pe pachet: schimbă pachetul, schimbă termenul, ajustează elementele și cantitățile selectate, suprascrie prețuri sau adaugă linii personalizate ocazionale. Previzualizează întotdeauna întâi: endpointul de previzualizare returnează compoziția rezultată și orice proratare înainte să se taxeze vreun ban.
const organizationId = "your_org_id";
const scheduleId = "your_schedule_id";
const token = "YOUR_TOKEN_HERE";
const headers = {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
};
const changes = {
organization_billing_package_id: "billing_package_id",
organization_billing_package_subscription_term_id: "subscription_term_id",
selected_group_items: [
// price_override + pricing_currency let you deviate from the package price
{ id: "group_item_id", quantity: 2, price_override: 39.00, pricing_currency: "EUR" }
],
custom_line_items: [
{ name_lang_map: { en: "One-off setup" }, quantity: 1, price: 150.00 }
],
// how the switch is billed: none | prorate_immediately | prorate_next_invoice
// (prorate_immediately requires an active schedule)
proration_mode: "prorate_next_invoice"
};
// 1. Preview, no changes are applied; returns the new composition + proration
await fetch(
`https://api.enlivy.com/organizations/${organizationId}/billing-schedules/${scheduleId}/preview-reconfigure`,
{ method: "POST", headers, body: JSON.stringify(changes) }
);
// 2. Apply
await fetch(
`https://api.enlivy.com/organizations/${organizationId}/billing-schedules/${scheduleId}/reconfigure`,
{ method: "PUT", headers, body: JSON.stringify(changes) }
); Citește analize agregate de venit recurent pe programele tale: un summary la un moment dat (cu proiecție înainte) sau o defalcare history_monthly, ca să alimentezi dashboarduri MRR fără să extragi fiecare program manual.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/billing-schedules/analytics/summary` +
// analyticsType: summary | history_monthly
`?direction=outbound&convert_to_currency=EUR`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Șterge temporar un program. Preferă setarea status pe cancelling (oprește facturarea viitoare la finalul ciclului) când vrei să păstrezi înregistrarea; șterge când vrei să dispară. Poate fi restaurat ulterior.
const organizationId = "your_org_id";
const scheduleId = "your_schedule_id";
const token = "YOUR_TOKEN_HERE";
// soft delete, restore via POST /billing-schedules/restore/{scheduleId}
fetch(`https://api.enlivy.com/organizations/${organizationId}/billing-schedules/${scheduleId}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}); Referință API
Network Exchanges prin API
Trimite și primește facturi electronice conforme legal peste rețelele PEPPOL și ale autorităților fiscale, programatic. Un network exchange este o singură transmitere a unei facturi către (sau de la) o instituție, precum ANAF în România. Enlivy construiește documentul UBL conform, îl semnează, îl transmite și urmărește răspunsul prin ciclul său de viață, așa că știi mereu dacă un document a fost acceptat, respins sau este încă în procesare.
Schimburile sunt emise (trimiți o factură pe care ai emis-o) sau primite (extragi documente adresate ție). Această referință începe cu acțiunea cheie, împingerea unei facturi în rețea, apoi acoperă listarea, inspectarea, extragerea documentelor primite și descărcarea fișierelor semnate. Fiecare schimb poartă un status live pe care îl poți interoga.
Trimite o factură emisă către o instituție de rețea. Factura este payloadul; nu există corp de cerere. Enlivy generează UBL-ul conform, îl semnează, îl transmite și returnează înregistrarea network-exchange rezultată cu statusul ei inițial. Instituțiile către care poate merge o factură sunt expuse pe factura însăși.
const organizationId = "your_org_id";
const invoiceId = "your_invoice_id";
const token = "YOUR_TOKEN_HERE";
const headers = {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
};
// 1. Discover eligible institutions for this invoice.
// invoice.peppol_exchange_push_options lists the institution ids you may push to;
// invoice.peppol_exchanges_pushed lists the ones already sent.
const invoice = await fetch(
`https://api.enlivy.com/organizations/${organizationId}/invoices/${invoiceId}`,
{ method: "GET", headers }
).then((r) => r.json());
// 2. Push to a specific institution. The id is a string, e.g. "anaf" (Romania / ANAF).
const institution = "anaf";
const exchange = await fetch(
`https://api.enlivy.com/organizations/${organizationId}/invoices/${invoiceId}/peppol/${institution}`,
{ method: "POST", headers } // no request body, the invoice is the document
).then((r) => r.json());
// The response is the network-exchange record. Poll its `status`:
// pending | processing | success | success_in_exchange_queue | success_pending_archive
// | change_required | rejected | rejected_at_exchange | failed | failed_credentials_expired
// A transport/connectivity failure to the institution returns HTTP 503. Listează fiecare schimb cu paginare și filtrare: restrânge la o singură factură, filtrează după statusul schimbului sau după starea facturii asociate și limitează după dată. Așa construiești un dashboard de conformitate cu ce a fost trimis și unde se află fiecare document.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/invoices/network-exchanges?page=1&limit=20` +
// filters: status, organization_invoice_id, invoice_state (the linked invoice's state),
// created_at_from/to, updated_at_from/to, ids
`&status=success` +
`&include=invoice`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Recuperează un singur schimb: statusul lui, identificatorii de schimb și de mesaj ai instituției, response_json-ul brut al instituției și numele fișierelor generate. Include parsed_data ca să obții conținutul parsat al documentului schimbat, sau invoice pentru factura sursă.
const organizationId = "your_org_id";
const exchangeId = "your_exchange_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/invoices/network-exchanges/${exchangeId}` +
// includes: organization, invoice, parsed_data (the parsed UBL as structured data), tag_ids
`?include=parsed_data,invoice`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Extrage documentele care ți-au fost trimise ție peste rețeaua unei instituții, facturi de la furnizori livrate prin ANAF, de exemplu. Enlivy le preia și le ingerează ca schimburi primite. Limitează sincronizarea cu date_from.
const organizationId = "your_org_id";
const institutionId = "anaf";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/invoices/network-exchanges/${institutionId}/pull` +
`?date_from=2026-07-01`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Extrage artefactele unui schimb: documentul UBL/XML conform, semnătura lui digitală și PDF-ul lizibil de om. Fiecare returnează un flux de fișier.
const organizationId = "your_org_id";
const exchangeId = "your_exchange_id";
const token = "YOUR_TOKEN_HERE";
const authOnly = { Authorization: `Bearer ${token}` };
const url = `https://api.enlivy.com/organizations/${organizationId}/invoices/network-exchanges/${exchangeId}`;
// the signed UBL / XML document
const xml = await fetch(`${url}/download`, { headers: authOnly }).then((r) => r.blob());
// the detached digital signature
const signature = await fetch(`${url}/download-signature`, { headers: authOnly }).then((r) => r.blob());
// the human-readable PDF rendering
const pdf = await fetch(`${url}/download-pdf`, { headers: authOnly }).then((r) => r.blob()); Recuperează statusul din partea instituției și detaliile de validare pentru un schimb, util când un document revine ca change_required sau rejected și ai nevoie de motive ca să corectezi și să retrimiți.
const organizationId = "your_org_id";
const exchangeId = "your_exchange_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/invoices/network-exchanges/${exchangeId}/information`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Referință API
Tranzacții Bancare prin API
Adu fiecare mișcare prin conturile tale într-un singur registru, apoi dă-i sens. Tranzacțiile bancare ajung în Enlivy din sincronizarea bancară, plățile Stripe sau introducere manuală, iar API-ul îți permite să le clasifici după tipul de cost și să le reconciliezi cu facturile, chitanțele și fluturașii de salariu pe care le achită. Fiecare tranzacție își urmărește propria stare, de la backlog până la complet connected.
Două resurse lucrează împreună: tipurile de cost (vocabularul tău reutilizabil de clasificare precum „Payroll”, „Încasare client”, „Software”, fiecare declarând cu ce poate fi legat) și tranzacțiile bancare, mișcările în sine. Exemplele de mai jos acoperă ambele, plus listare, filtrare, reconciliere și analize.
Listează tipurile de cost cu care clasifici tranzacțiile. Fiecare poartă o etichetă localizată, dacă e obligatorie o legătură cu o entitate de business și cu ce tipuri de entitate se poate conecta.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/bank-transaction-cost-types?page=1&limit=50`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Definește o categorie de clasificare. Setează dacă tranzacțiile de acest tip trebuie reconciliate și, dacă da, cu ce tipuri de entitate se pot conecta. Tipurile de cost pot fi imbricate sub un părinte pentru o ierarhie.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/bank-transaction-cost-types`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
title_lang_map: { en: "Client Payment", ro: "Încasare client" }, // per-locale map
// does a transaction of this type have to be linked to a business entity?
connection_required: true,
// which entity types it may be connected to (required when connection_required = true)
// options: invoice | receipt | payslip | bank_transaction | user
connection_types: ["invoice", "receipt"],
// optional: parent cost type for a nested / hierarchical category
organization_bank_transaction_cost_type_id: null
})
}); Interoghează tranzacțiile cu paginare, căutare și filtre. Filtrează după starea de clasificare, direcție sau după o entitate conectată specifică și limitează după dată. Extinde tipul de cost asignat și entitățile conectate inline.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/bank-transactions?page=1&limit=20` +
// state: backlog | classified | connected | connected_partially | danger | trashed
`&state=backlog&direction=inbound` +
// find transactions connected to a specific entity, send BOTH params together:
// `&connection_entity_type=invoice&connection_entity_id=invoice_id` +
// free-text search with q=... (min 3 chars) instead of ids
`&include=cost_type,connection_entities,bank_account`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Recuperează o singură tranzacție: suma și moneda ei, direcția, tipul de cost asignat, entitățile cu care e conectată și orice metadate de payout Stripe / raportare pentru tranzacțiile sincronizate.
const organizationId = "your_org_id";
const transactionId = "your_transaction_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/bank-transactions/${transactionId}` +
// includes: organization, bank_account, cost_type, connection_entities, deleted_by_user, tag_ids
`?include=cost_type,connection_entities,bank_account`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Înregistrează o tranzacție manual (majoritatea tranzacțiilor ajung automat prin sincronizare bancară sau Stripe). O poți clasifica în același apel trimițând un tip de cost și conexiunile sale.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/bank-transactions`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
hash: "unique-dedupe-key", // required; unique within a bank account (import de-dup key)
title: "Incoming transfer from Acme Studio",
amount: 1200.00, // money: signed decimal in MAJOR units (not cents)
// direction is DERIVED from the sign (positive = inbound, negative = outbound)
currency: "EUR",
organization_bank_account_id: "bank_account_id",
sender_label: "ACME STUDIO SRL", // free-text counterpart name from the bank feed
note: "Invoice #2026-0142 settlement"
// state is managed by classification (defaults to "backlog"), no need to set it.
// optionally classify inline with organization_bank_transaction_cost_type_id + connection_entities (see below).
})
}); Inima fluxului. Asignează un tip de cost ca să clasifici tranzacția, apoi conecteaz-o la entitățile pe care le achită. Enlivy avansează starea tranzacției pe măsură ce lucrezi: asignarea unui tip de cost o marchează classified; conectarea entităților o marchează connected (sau connected_partially dacă sumele legate nu acoperă întreaga tranzacție).
const organizationId = "your_org_id";
const transactionId = "your_transaction_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/bank-transactions/${transactionId}`, {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
// 1. Classify, assign a cost type. Moves state: backlog -> classified.
organization_bank_transaction_cost_type_id: "cost_type_id",
// 2. Reconcile, link the transaction to what it pays for.
// connection_entity_type must be one of the cost type's allowed connection_types.
// The array is an UPSERT:
// { connection_entity_type, connection_entity_id, amount } -> create a link
// { id } -> keep an existing link
// { id, _deleted: true } -> remove a link
// (omitting an existing link does NOT delete it)
// Amounts covering the full transaction -> "connected"; partial -> "connected_partially".
connection_entities: [
{ connection_entity_type: "invoice", connection_entity_id: "invoice_id", amount: 1000.00 },
{ connection_entity_type: "receipt", connection_entity_id: "receipt_id", amount: 200.00 }
]
})
}); Citește analize agregate de cash-flow pe tranzacțiile tale: un summary la un moment dat sau o defalcare history_monthly, restrânse după cont, direcție, stare și interval de date și convertibile într-o singură monedă de raportare.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/bank-transactions/analytics/summary` +
// analyticsType: summary | history_monthly
`?start_date=2026-01-01&end_date=2026-12-31` +
`&direction=outbound&entity_state=connected&convert_to_currency=EUR`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Șterge temporar o tranzacție (starea ei devine trashed). Poate fi restaurată ulterior.
const organizationId = "your_org_id";
const transactionId = "your_transaction_id";
const token = "YOUR_TOKEN_HERE";
// soft delete, restore via POST /bank-transactions/restore/{transactionId}
fetch(`https://api.enlivy.com/organizations/${organizationId}/bank-transactions/${transactionId}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}); Referință API
Gestionarea Taxelor prin API
Enlivy modelează taxele așa cum Stripe modelează codurile de taxă pentru produse, nu o clasă per țară. O clasă de taxă este o categorie semantică de produs (Bunuri și servicii standard, Cărți, Alimente, Servicii digitale, Scutit), iar tu marchezi fiecare produs cu categoria care este, fără să alegi manual un procent. Sub fiecare clasă stă un set de cote de taxă, una per țară sau scenariu de vânzare, iar la momentul facturării Enlivy determină singura cotă aplicabilă din țara și statutul fiscal al cumpărătorului, luând potrivirea cu cea mai mare prioritate.
Exemplele de mai jos acoperă ambele niveluri: clasa (categoria) și cotele (rândurile pe țară care se rezolvă sub ea).
Listează categoriile de taxă ale produselor tale. Include tax_rates_overview pentru un sumar al setului de cote care se rezolvă sub fiecare clasă.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/tax-classes` +
// filters: name, description, ids
`?page=1&limit=20` +
// include tax_rates_overview for a per-class summary of the rate set
`&include=tax_rates_overview`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Creezi câte o clasă per categorie de produs pe care o vinzi. O clasă este o categorie, nu o țară și nu o singură cotă; rândurile pe țară stau sub ea. Produsele își îndreaptă apoi organization_tax_class_id către categoria de care aparțin.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
// Create one class per product CATEGORY you sell (Standard goods & services, Books,
// Foodstuffs, Accommodation, Digital services / SaaS, Exempt). A class is a category,
// not a country and not a single rate; the country rows live underneath it.
fetch(`https://api.enlivy.com/organizations/${organizationId}/tax-classes`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
// the category, not a rate: per-locale maps
name_lang_map: { en: "Books & publications", ro: "Cărți și publicații" },
description_lang_map: { en: "Reduced-rate category for books and periodicals." }
})
}); Actualizezi etichetele unei categorii sau o ștergi logic (o poți restaura ulterior). Ștergerea unei clase elimină categoria sub care se rezolvă rândurile de cote, așa că mai întâi le elimini sau le reasignezi.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
const taxClassId = "your_tax_class_id";
const headers = { Authorization: `Bearer ${token}`, "Content-Type": "application/json" };
const url = `https://api.enlivy.com/organizations/${organizationId}/tax-classes/${taxClassId}`;
// Update a category's labels
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify({ name_lang_map: { en: "Books & publications (2026)" } })
});
// soft delete; restore via POST /tax-classes/restore/{taxClassId}
fetch(url, { method: "DELETE", headers }); Listează rândurile de cote. Extinde clasa părinte și locațiile pe care se aplică fiecare rând. Pentru un sumar per clasă, folosește include-ul tax_rates_overview al clasei.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/tax-rates` +
`?page=1&limit=50` +
// includes: organization, organization_tax_class, locations
`&include=organization_tax_class,locations`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); O cotă de taxă este un rând dintr-un set de cote al unei clase, nu o taxă de sine stătătoare. Fiecare rând declară un domeniu, o categorie TVA EN16931 și o prioritate; la facturare Enlivy ia rândul cu cea mai mare prioritate care se potrivește. Setul canonic: domestic în țara de origine, taxare inversă B2B UE, per-țară OSS și un catch-all pentru restul lumii.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
const headers = { Authorization: `Bearer ${token}`, "Content-Type": "application/json" };
const classId = "standard_goods_class_id";
// A tax rate is ONE ROW in a class's rate set, not a standalone tax. Each row declares a
// scope (locations and/or buyer conditions), an EN16931 VAT category (eu_vat_class), and a
// priority. At invoice time Enlivy takes the highest-priority row whose scope + buyer match.
const common = {
organization_tax_class_id: classId,
has_eu_vat_properties: true,
is_compound: false,
is_shipping: false,
is_inclusive: false
};
// The canonical rate set for one category (home country = Romania): four archetypes.
const rateSet = [
{
// Home-country domestic: the default when selling within Romania
name: "RO Domestic 21%", rate: 21, priority: 1000,
eu_vat_class: "S", // Standard-rated, stamped on the invoice line
has_locations: true, locations: [{ country_code: "RO" }]
},
{
// EU B2B reverse charge: 0%, matches ONLY VAT-registered businesses in other EU states
name: "EU B2B Reverse Charge", rate: 0, priority: 900,
eu_vat_class: "AE", vatex_code: "VATEX-EU-AE", // exemption reason (PEPPOL)
is_business_entity: true, is_eu_vat_registered: true, // buyer-qualification gates
has_locations: true, locations: [{ country_code: "DE" }, { country_code: "FR" }]
},
{
// Per-country EU domestic (B2C digital / OSS): charge the buyer's own country rate
name: "DE Domestic 19%", rate: 19, priority: 800,
eu_vat_class: "S",
has_locations: true, locations: [{ country_code: "DE" }]
},
{
// Rest of world: outside scope, 0%, no locations = catch-all fallback
name: "Rest of World (Outside Scope)", rate: 0, priority: 100,
eu_vat_class: "O", vatex_code: "VATEX-EU-O",
has_locations: false
}
];
for (const row of rateSet) {
await fetch(`https://api.enlivy.com/organizations/${organizationId}/tax-rates`, {
method: "POST",
headers,
body: JSON.stringify({ ...common, ...row })
});
} Ajustezi un singur rând: procentul, categoria TVA, domeniul sau prioritatea în ordinea de rezolvare. Trimiți doar câmpurile pe care le schimbi.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
const taxRateId = "your_tax_rate_id";
// Adjust a single row: its percentage, VAT category, scope, or priority in the ladder.
// Send only the fields you are changing.
fetch(`https://api.enlivy.com/organizations/${organizationId}/tax-rates/${taxRateId}`, {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
rate: 20, // e.g. the RO domestic rate changes
display_name: "VAT 20%"
})
}); Ștergi logic un singur rând din setul unei clase, de exemplu pentru a retrage o țară în care nu mai vinzi. Poate fi restaurat ulterior.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
const taxRateId = "your_tax_rate_id";
// soft delete; restore via POST /tax-rates/restore/{taxRateId}
fetch(`https://api.enlivy.com/organizations/${organizationId}/tax-rates/${taxRateId}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}); Referință API
Gestionarea Prospecților prin API
Conectează captarea de lead-uri, CRM-ul și automatizările de vânzări direct în Enlivy. API-ul de Prospecți îți oferă control programatic asupra pipeline-ului tău: creezi lead-uri din orice sursă, îi muți prin etapele tale și înregistrezi fiecare interacțiune pe măsură ce se întâmplă.
Exemplele de mai jos acoperă cele mai comune operațiuni de prospectare: listarea și filtrarea prospecților, crearea unui lead, avansarea lui prin pipeline și înregistrarea activităților precum apeluri, întâlniri și schimbări de status, astfel încât cronologia ta să rămână mereu sincronizată.
Adu-ți pipeline-ul în orice dashboard sau job de sincronizare. Interoghează prospecții cu paginare, filtrează după etapă, responsabil, sursă sau interval de date și caută full-text după nume, companie sau email. Extinde înregistrări asociate precum etapa curentă și membrul echipei asignat.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/prospects?page=1&limit=20&source_type=inbound&include=organization_prospect_status,assigned_organization_user&include_meta=navigation`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Recuperează un singur prospect cu tot ce este atașat: date de contact, atribuirea sursei, buget, etapa curentă din pipeline și marcaje temporale de ciclu de viață precum calificat, câștigat și pierdut.
const organizationId = "your_org_id";
const prospectId = "your_prospect_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/prospects/${prospectId}?include=organization_prospect_status,assigned_organization_user`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Capturează un lead din orice sursă: o pagină de destinație, o campanie de reclame, o listă de outbound sau propria ta aplicație. Trimite o persoană, o companie sau ambele, marchează de unde a venit și pune-l direct în pipeline.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/prospects`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"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"
})
}); Actualizează 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.
const organizationId = "your_org_id";
const prospectId = "your_prospect_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/prospects/${prospectId}`,
{
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
summary: "Budget confirmed, decision expected next week.",
budget: "8000",
budget_currency: "EUR"
})
}
); Mută un prospect un pas mai departe pe pipeline-ul tău urmând un traseu de status configurat. Fiecare avansare înregistrează cine a efectuat-o, un rezultat și o notă opționale, poate lega un raport și scrie automat o intrare în cronologia prospectului.
const organizationId = "your_org_id";
const prospectId = "your_prospect_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/prospects/${prospectId}/advance`,
{
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
organization_prospect_status_path_id: "status_path_id_here",
outcome: "Qualified, budget and timeline confirmed.",
description: "Moved from New to Qualified after the discovery call."
})
}
); Înregistrează o interacțiune cu un prospect: un apel, o întâlnire, un email, o notă. Activitățile construiesc cronologia prospectului și oferă echipei tale un istoric comun, cronologic, al fiecărei interacțiuni.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/prospect-activities`,
{
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"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"
})
}
); Citește fluxul de activități din organizația ta. Extinde fiecare intrare cu prospectul de care aparține, membrul echipei care a efectuat-o și orice raport sau schimbare de status asociată.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/prospect-activities?page=1&limit=20&include=organization_prospect,performed_by_organization_user&include_meta=navigation`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Referință API
Gestionarea Contractelor prin API
Redactează, trimite, semnează și urmărește contracte de la un capăt la altul, fără ca utilizatorii tăi să părăsească vreodată produsul tău. API-ul de Contracte acoperă întreg ciclul de viață: asamblezi un contract din capitole și părți, îl muți prin propriul tău flux de status, deschizi o sesiune de semnare cu valoare legală pentru fiecare semnatar și extragi documentul semnat împreună cu dovezile de audit rezistente la falsificare.
Totul este organizat în jurul a patru resurse: contracte (documentul, capitolele și părțile sale), statusuri de contract (etapele configurabile ale fluxului tău), sesiuni de semnare (una per parte, cu verificare prin email / SMS) și pista de audit (jurnale de livrare și dovezi de semnare). Exemplele de mai jos parcurg întreg fluxul.
Interoghează contractele cu paginare, filtrare bogată și căutare full-text. Filtrează după status, expeditor, destinatar, direcție (primite / emise), categorie (core, amendament, addenda, supliment), sursă (intern / încărcat), limbă, contract părinte sau oricare dintre intervalele de date (issued_at, ends_at, created_at, updated_at). Extinde înregistrările asociate inline.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/contracts?page=1&limit=20` +
// filters are optional and combinable
`&direction=outbound&category=core` +
// pass a q=... param instead of ids to run a full-text search
`&include=contract_status,sender_user,receiver_user,contract_parties` +
`&include_meta=navigation`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Recuperează un singur contract cu tot ce este atașat: capitolele sale, părțile sale, statusul curent din flux, fișierul asociat și expeditorul / destinatarul.
const organizationId = "your_org_id";
const contractId = "your_contract_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/contracts/${contractId}` +
// available includes: organization, parent_contract, sender_user, receiver_user,
// file, contract_status, contract_chapters, contract_parties, contract_prefix
`?include=contract_chapters,contract_parties,contract_status`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Construiește un contract dintr-un singur apel: metadatele sale, corpul său sub formă de capitole ordonate și părțile sale. O parte poate fi o persoană fizică sau o organizație, iar fiecare poartă modul în care ar trebui referită în document și dacă semnătura sa este obligatorie.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/contracts`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
// core | amendment | addenda | supplement.
// amendment/addenda/supplement REQUIRE organization_contract_id -> a "core" parent contract.
category: "core",
// internal -> auto-numbered from a prefix (organization_contract_prefix_id required below)
// uploaded -> you supply `number`, and may set `signed_by_all_parties_at`
source: "internal",
direction: "outbound", // outbound | inbound
organization_sender_user_id: "org_user_sender_id",
organization_receiver_user_id: "org_user_receiver_id",
organization_contract_status_id: "contract_status_id",
// required only for internal + core; omit it for any other source/category
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, party_country_code, first_name, last_name are required on every party
party_type: "organization", // organization | individual
party_country_code: "RO",
// organization parties additionally REQUIRE organization_name + organization_type
organization_name: "Acme Studio SRL",
organization_type: "srl", // value comes from reference data
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
// country-specific `information` (person) and `organization_information` (company)
// JSON blocks are also accepted; their shape is validated against the country schema.
},
{
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
}
]
})
}); Actualizează metadatele unui contract, mută-l în alt status, ajustează-i capitolele sau rafinează-i părțile. Trimiți doar ce vrei să schimbi.
const organizationId = "your_org_id";
const contractId = "your_contract_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/contracts/${contractId}`, {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
// partial update, only the fields you send are touched
organization_contract_status_id: "next_status_id",
sub_title: "2026 Engagement (revised)",
ends_at: "2027-12-31 23:59:59"
})
}); Randează și descarcă contractul ca PDF, același document pe care îl văd și părțile cu care contractezi.
const organizationId = "your_org_id";
const contractId = "your_contract_id";
const token = "YOUR_TOKEN_HERE";
// returns a file stream, read it as a blob, not JSON
const pdf = await fetch(
`https://api.enlivy.com/organizations/${organizationId}/contracts/${contractId}/download`,
{
method: "GET",
headers: { Authorization: `Bearer ${token}` }
}
).then((r) => r.blob()); Șterge temporar un contract. Poate fi restaurat ulterior.
const organizationId = "your_org_id";
const contractId = "your_contract_id";
const token = "YOUR_TOKEN_HERE";
// soft delete, restore via POST /contracts/restore/{contractId}
fetch(`https://api.enlivy.com/organizations/${organizationId}/contracts/${contractId}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}); Contractele trec prin fluxul tău, nu printr-unul fix. Fiecare status corespunde unei stări din ciclul de viață (draft, action_required, accepted, breach sau terminated), poartă etichete localizate, o culoare și o ordine și se aplică pe contracte primite, emise sau orice direcție. Listează-le ca să construiești un board sau să automatizezi procese.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/contract-statuses?page=1&limit=50`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Definește o nouă etapă în flux. Etichetele și descrierile sunt hărți de limbă per-locale, contract_state leagă etapa de o stare din ciclul de viață și poți avansa automat către alt status odată ce o acțiune reușește.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/contract-statuses`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
// per-locale maps, not plain strings
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", // draft | action_required | accepted | breach | terminated
direction: "any", // inbound | outbound | any
// order is unique per organization, pick a free slot,
// or reorder existing stages via PUT /contract-statuses/reorder
order: 3,
rgba_color_code: "rgba(59, 130, 246, 1)"
})
}); O sesiune de semnare este creată per parte care trebuie să semneze. Alege tipurile de semnătură acceptate (desen, bifă, fișier clasic, fișier electronic), ce confirmări sunt necesare (email, telefon, confirmare cu valoare legală) și un termen de expirare. Cu signature_source user_flow, Enlivy găzduiește experiența ghidată de semnare și returnează un URL de semnare tokenizat.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/contract-signatures`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
organization_contract_id: "contract_id",
// one active session per party, organization_contract_party_id is unique
organization_contract_party_id: "party_id",
// user_flow -> Enlivy hosts the signer experience (get the link via sign_session_url)
// admin_panel -> you record the signature yourself and may send is_signed / signature_drawing / signed_contract
signature_source: "user_flow",
sign_session_signature_types: ["draw", "checkbox"], // draw | checkbox | file_classic | file_electronic
sign_session_required_confirmations: ["email", "legally_binding"], // email | phone | legally_binding
expires_at: "2026-07-17 23:59:59"
})
}); Livrează sesiunea de semnare către parte prin email sau SMS, cu un mesaj personalizat opțional. Fiecare trimitere este înregistrată în jurnalul de notificări pentru audit.
const organizationId = "your_org_id";
const signatureId = "your_signature_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/contract-signatures/${signatureId}/send`,
{
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
method: "email", // email | sms
message: "Please review and sign the agreement by Friday."
})
}
); Interoghează o sesiune pentru statusul ei, dacă este semnată, expirarea ei și ce artefacte de dovadă există. Include sign_session_url ca să obții linkul de semnare găzduit pe care să-l dai semnatarului.
const organizationId = "your_org_id";
const signatureId = "your_signature_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/contract-signatures/${signatureId}` +
// sign_session_url returns the hosted link to give to the signer.
// status is one of: pending | sent | completed | expired | void
`?include=sign_session_url,organization_contract`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Listează fiecare sesiune de semnare, opțional restrânsă la un singur contract, cel mai rapid mod de a vedea cine a semnat și cine este încă în așteptare pe toate părțile.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/contract-signatures` +
// omit organization_contract_id to list sessions across every contract
`?organization_contract_id=contract_id&include=sign_session_url`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Extrage pachetul de dovezi rezistent la falsificare (autentificare, consimțământ și biometrie a semnăturii captate în timpul semnării) pentru conformitate și gestionarea disputelor.
const organizationId = "your_org_id";
const contractId = "your_contract_id";
const token = "YOUR_TOKEN_HERE";
// also available per session: /contract-signatures/{signatureId}/download-evidence
const evidence = await fetch(
`https://api.enlivy.com/organizations/${organizationId}/contracts/${contractId}/download-evidence`,
{
method: "GET",
headers: { Authorization: `Bearer ${token}` }
}
).then((r) => r.blob()); Referință API
Gestionarea Produselor prin API
Menține-ți catalogul sincronizat direct din propriile sisteme. API-ul de Produse îți oferă control programatic asupra produselor reutilizabile pe care le vinzi (servicii, produse digitale, produse fizice și bonusuri), fiecare cu prețuri multi-valută, denumiri per limbă, clasă de taxă și metadatele necesare pentru e-facturare conformă. Produsele create aici ajung direct în facturi, propuneri și planuri de facturare.
Exemplele de mai jos acoperă operațiunile principale: listarea și căutarea produselor, crearea unuia, editarea și ștergerea lui.
Interoghează-ți catalogul cu paginare, filtrare și căutare full-text. Filtrează după nume sau descriere, adu id-uri specifice și extinde clasa de taxă în răspuns.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/products` +
// filters: name, description, ids (or q=... for full-text search)
`?page=1&limit=20&name=Consulting` +
// includes: organization, tax_class, tag_ids, deleted_by_user
`&include=tax_class`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Adaugă un produs în catalog. Un produs are nevoie de un type și de un price_map; restul (denumiri localizate, clasă de taxă, coduri de bare și metadate de e-facturare) este opțional.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/products`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
type: "service", // required: digital | physical | service | bonus
// required: a { currency: amount } map (amounts max 2 decimals).
// With 2+ currencies, primary_currency becomes required.
price_map: { EUR: "49.90", USD: "54.00" },
primary_currency: "EUR",
// per-locale maps (not plain strings)
name_lang_map: { en: "Consulting Hour", ro: "Oră de consultanță" },
unit_lang_map: { en: "hour", ro: "oră" },
description_lang_map: { en: "One hour of advisory services." },
alias: "consulting-hour", // optional; unique per organization (alpha-dash)
organization_tax_class_id: "tax_class_id",
is_sold: true, // whether it is actively offered
// optional e-invoicing metadata (used when the product lands on an invoice line)
invoice_schema_map: {
classification_identifier_cpv: "79411000-8", // CPV code
peppol_billing_unit_code: "HUR" // PEPPOL unit code
},
// optional identifiers
ean_number: null,
upc_number: null,
stripe_product_id_list: ["prod_XXXXXXXX"] // each id must start with "prod_"
})
}); Actualizează orice parte a unui produs: îi schimbi prețul, denumirea, clasa de taxă sau comuți dacă este de vânzare. Trimiți doar câmpurile pe care vrei să le schimbi.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
const productId = "your_product_id";
fetch(`https://api.enlivy.com/organizations/${organizationId}/products/${productId}`, {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
// reprice: the price_map replaces the stored one
price_map: { EUR: "59.90", USD: "64.00" },
primary_currency: "EUR",
name_lang_map: { en: "Consulting Hour, Senior" },
is_sold: false
})
}); Șterge logic un produs, astfel încât să nu mai fie oferit. Poate fi restaurat ulterior.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
const productId = "your_product_id";
// soft delete; restore via POST /products/restore/{productId}
fetch(`https://api.enlivy.com/organizations/${organizationId}/products/${productId}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}); Referință API
Sesiuni de Autentificare prin API
Creează și recuperează sesiuni de autentificare pentru portalul de clienți pentru utilizatorii tăi, direct din API-ul de administrare. O sesiune acordă unuia dintre utilizatorii organizației tale acces restricționat și limitat în timp la aplicația pentru clienți (portalul), autentificat prin email, telefon sau un link magic. Găsești utilizatorul, deschizi o sesiune (după id sau după email), apoi o citești înapoi.
Recuperează utilizatorii pentru care poți deschide o sesiune. Filtrează după email, rulează o căutare full-text sau parcurge lista completă ca să găsești persoana potrivită.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/users?page=1&limit=20` +
// filters: email, created_at_from/to, updated_at_from/to, ids, or q=... for free-text search
`&email=jane@acme.example`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
); Deschide o sesiune pentru un utilizator specific referențiind organization_user_id-ul său. Asta țintește exact o singură identitate, deci sesiunea trece direct la autentificare, fără ambiguitate.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/user-client-portal-sessions`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
// reference the exact user identity
organization_user_id: "org_user_id",
name: "Jane Doe", // required: display name for the session
// how the user proves identity: email | phone | magic_authentication
authentication_method: "email",
// scope what the session may access in the portal
// options: invoices | receipts | network_exchanges | contracts | reports | payment_methods
permissions: ["invoices", "receipts", "payment_methods"],
// lifetime: set validity_hours OR expires_at (bounded by the server maximum)
validity_hours: 72
})
});
// Response includes: token, status, magic_authentication_url (for magic_authentication),
// authentication_verification_code (for email / phone), permissions, expires_at. Deschide o sesiune după email în loc de un id specific, util când știi doar adresa. Dacă emailul corespunde unui singur utilizator, sesiunea continuă direct. Dacă același email aparține mai multor identități, sesiunea e creată în starea awaiting_user_selection, iar utilizatorul e rugat în portal să aleagă cu ce identitate se autentifică înainte de a continua.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(`https://api.enlivy.com/organizations/${organizationId}/user-client-portal-sessions`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
// reference the user by email
email: "jane@acme.example",
name: "Jane Doe", // required: display name for the session
// how the user proves identity: email | phone | magic_authentication
authentication_method: "email",
// scope what the session may access in the portal
// options: invoices | receipts | network_exchanges | contracts | reports | payment_methods
permissions: ["invoices", "receipts", "payment_methods"],
// lifetime: set validity_hours OR expires_at (bounded by the server maximum)
validity_hours: 72
})
});
// Single match -> the session proceeds to authentication.
// Multiple matches -> status "awaiting_user_selection"; the user picks which
// identity to authenticate as in the portal before continuing. Citește o sesiune înapoi: statusul ei curent, când a fost folosită ultima dată, când expiră și utilizatorul căruia îi aparține. Interoghează statusul ca să vezi utilizatorul trecând prin autentificare (inclusiv selecția identității când sesiunea a fost deschisă după email).
const organizationId = "your_org_id";
const sessionId = "your_session_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/user-client-portal-sessions/${sessionId}` +
// includes: organization_user, organization
`?include=organization_user`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
);
// status: pending | email_verification_sent | awaiting_user_selection | success | expired Funcționează împreună cu
- Date Tranzacții Bancare Vezi toate conturile și tranzacțiile sincronizate într-un singur loc, mereu la zi și complet conectate.
- Tranzacții Bancare Ține-ți finanțele organizate cu precizie. Enlivy te ajută să gestionezi, importezi și sincronizezi toate tranzacțiile afacerii tale, din orice cont bancar, legându-le direct de facturi, chitanțe, fluturași de salariu și multe altele.
- Pachete de Facturare Creează un plan o singură dată și oferă-l săptămânal, lunar, anual sau în orice altă combinație între acestea. Clienții se pot abona, pot schimba perioada de facturare, pot trece la alt plan, își pot gestiona cardul, pot pune abonamentul pe pauză sau îl pot anula direct dintr-un portal personalizat cu brandul tău, fiecare modificare fiind previzualizată, recalculată proporțional și procesată automat.
- Billing Schedules Urmărește termenele și sumele plăților clienților. Gestionează facturile recurente și vezi plățile în așteptare.
- Contracte Redactează contracte din șabloane, trimite-le la semnare cu verificare prin SMS sau email, și urmărește fiecare semnătură și reînnoire. Copiile semnate se livrează automat.
- Portal Clienți Un portal self-service sub brandul tău și pe propriul domeniu, unde clienții pot accepta propuneri, achita facturi, gestiona abonamente, semna contracte și trimite rapoarte, totul pe cont propriu. Fiecare acțiune se sincronizează în timp real cu Enlivy.
- Data Export Enlivy permite export rapid în formate standard, gata pentru analize, rapoarte sau conformitate, cu integrare ușoară și control total.
- Guidelines Notează și păstrează cele mai bune practici și reguli la un loc, pentru ca echipa ta să fie mereu pe aceeași lungime de undă.
- Facturi Creezi o factură conformă în câteva secunde, o trimiți, și se leagă singură de contractul, plata și tranzacția bancară de care aparține. eFactura este inclusă, așa că tot ce se întâmplă între emitere și încasare are loc într-un singur loc.
- MCP Pune întrebări despre facturile, contractele și pipeline-ul tău și rezolvă activități reale, în siguranță, cu acces limitat exact la ceea ce contul tău poate face deja.
- Network Exchanges Trimite și primește facturi automat, direct prin eFactura ANAF, cu PEPPOL și alte platforme UE pe aceleași șine. Facturile primite se preiau singure, cele emise se trimit după programul tău, iar fiecare schimb păstrează un istoric complet. Fără fișiere XML, fără încărcări manuale.
- Fluturași de Salariu Un sistem flexibil de fluturași de salariu pe care îl controlezi tu, cu fiecare fluturaș legat de contract, plată și tranzacția bancară corectă.
- Playbooks Proiectează, implementează și perfecționează proceduri pas cu pas pentru orice flux de lucru. Asigură consistență, reduce erorile și ghidează echipa prin sarcini repetabile, cu structură și claritate integrate.
- Produse Construiește un catalog reutilizabil cu tot ce vinzi, servicii sau bunuri, cu preț, unitate, taxă și descriere setate o singură dată. Fiecare produs e gata să fie introdus într-o ofertă sau o factură în câteva secunde.
- Prospects Urmărește fiecare oportunitate, de la primul contact până la factura plătită, cu istoric complet al activităților, emailuri automate în funcție de status și colaborare cu clientul integrată direct în flux.
- Chitanțe Chitanțele îți oferă o evidență structurată a fiecărei plăți, bani intrați și bani ieșiți, legate de facturile și contractele tale, cu cashflow-ul mereu la zi.
- Rapoarte Înlocuiește actualizările împrăștiate prin chat și email cu rapoarte structurate pe care echipa ta le completează pe un calendar fix. Definești întrebările o singură dată cu o schemă reutilizabilă, oamenii potriviți primesc raportul potrivit la momentul potrivit, iar fiecare răspuns ajunge într-un singur loc, gata de comparat.
- Integrare Slack Renunță la verificarea constantă a dashboard-urilor pentru a afla ce s-a modificat. Enlivy trimite automat în Slack actualizările care contează, de la plăți primite și propuneri trimise, până la contracte noi și activitate de la clienți.
- Taxe Nu mai alegi manual cota de TVA pentru fiecare factură. Atribui o Clasă de taxe unui produs sau unei linii, iar Enlivy aplică automat cota corectă, în funcție de cine este clientul și unde se află, cu codurile corecte pentru e-Factura incluse.
- Utilizatori Toți cei cu care lucrezi, clienți, furnizori, angajați, contabili, într-un singur loc. Atribui fiecăruia un rol care decide ce vede și ce poate face, apoi îi pui direct în lucru: facturare, salarii, contracte, în câteva secunde.
- Webhooks În momentul în care se întâmplă ceva în Enlivy, o factură este plătită, o tranzacție ajunge, un utilizator se schimbă, un webhook lansează un apel către sistemul tău. Reacționezi în timp real, în loc să interoghezi sau să aștepți rapoarte.