Çelësat API dhe webhook-et e lidhin SADE CRM me pjesën tjetër të softuerit tuaj. Kërkojnë një zhvillues, ose një mjet, si një shërbim automatizimi, që mund të dërgojë dhe të marrë kërkesa HTTP.
- Një çelës API i lejon një serveri të dërgojë kërkesa dhe aktivitet në CRM-në tuaj: pjesën e pasme të faqes suaj, formularët e kërkesave të një mjeti reklamimi, sistemet tuaja.
- Një webhook është drejtimi i kundërt: SADE CRM thërret një adresë të internetit tuaj sa herë që ndodh diçka me një nga klientët tuaj, që softueri juaj tjetër ta ndjekë.
Të dyja i vendos një administrator i agjencisë te Cilësimet → Integrimet, vetëm në CRM-në web. Karta Çelësat API lidhet me këtë faqe: Si të konfiguroni çelësat API dhe webhook-et. Për një formular të thjeshtë kontakti në faqen tuaj nuk ju duhet asnjëri: përdorni një formular faqeje. Që portalet e tjera të lexojnë njoftimet tuaja, shihni feed-et Kyero dhe OpenImmo te Importet dhe feed-et.
Jepini këtë faqe zhvilluesit tuaj. Ka gjithçka që i duhet.

Cilësimet → Integrimet. Karta Çelësat API është më poshtë, dhe Webhooks poshtë saj.
Çelësat API
Krijimi i një çelësi
- Hapni Cilësimet → Integrimet dhe shkoni te karta Çelësat API.
- Klikoni Krijo çelës.
- Jepini një Emri sipas asaj që do ta përdorë, si “Faqja jonë” ose “Facebook lead ads”. Emri ju tregon cilin çelës ta revokoni më vonë, dhe është burimi i kërkesave të dërguara me çelësin, përveç nëse dërguesi jep një tjetër.
- Klikoni Krijo çelës.
- Dritarja Kopjo çelësin e ri e tregon çelësin vetëm një herë. Klikoni Kopjo çelësin.
- Klikoni E kopjova.
- Jepuni çelësin zhvilluesit tuaj përmes një kanali të sigurt, si një menaxher fjalëkalimesh. Jo me email ose bisedë të thjeshtë.
E rëndësishme: nuk do ta shihni më çelësin. SADE CRM ruan vetëm një gjurmë dixhitale të tij, ndaj askush, as SADE, nuk mund t’jua tregojë më vonë. Nëse humbet, revokojeni dhe krijoni një të ri.
Mbajtja e çelësave sekretë
Një çelës fillon me sade_live_. Kushdo që e ka mund të dërgojë kërkesa në CRM-në tuaj.
- Mbajini çelësat vetëm në servera. Kurrë mos e vendosni një çelës në një faqe interneti, në një aplikacion telefoni ose në diçka që shfletuesi i një vizitori e shkarkon, ku kushdo mund ta lexojë.
- Krijoni një çelës për çdo faqe ose mjet. Kështu mund ta fikni njërin pa prekur të tjerët.
- Nëse një çelës mund të ketë dalë jashtë, revokojeni dhe krijoni një të ri.
Lista e çelësave
Lista tregon për çdo çelës Emri, fillimin e Çelësi (për shembull sade_live_XMfm…), kur u Krijuar, kur u Përdorur së fundi (“Kurrë” nëse ende jo), dhe Statusi: Aktiv ose Revokuar. Çdo çelës mund të bëjë të njëjtën gjë: të dërgojë ngjarje në agjencinë tuaj. Nuk ka leje të veçanta për të zgjedhur.
Revokimi i një çelësi
- Klikoni Revoko te rreshti i çelësit.
- Konfirmoni me Revoko çelësin.
Që nga ai çast çdo gjë që ende dërgon me çelësin refuzohet. Revokimi nuk kthehet pas; çelësi mbetet në listë, i zbehtë, si Revokuar.
Dërgimi i kërkesave me një çelës
Zhvilluesi juaj e dërgon çdo kërkesë ose pjesë aktiviteti si një kërkesë HTTP POST te shtegu /api/v1/events në adresën API të SADE. Kjo adresë është ajo në kodin e formularit të faqes suaj: pjesa para /forms/v1.js poshtë Kodi për faqen tuaj. Nëse nuk keni formular faqeje, kërkojani SADE-s.
Dërgojeni çelësin në header-in Authorization. Gjithçka është JSON, dhe kohët janë në ISO 8601 me zonë kohore.
POST /api/v1/events
Authorization: Bearer sade_live_…
Content-Type: application/json
Idempotency-Key: 7d4c0a3e-2b1f-4c55-9e0a-3f1d2a6b8c90
{
"type": "property_inquiry",
"source": "tiranaliving.al",
"message": "Is the flat still available? Could I see it on Saturday?",
"person": {
"name": "Klea Muka",
"email": "[email protected]",
"phone": "+355 68 412 3377",
"language": "sq"
},
"property": { "id": "c8f933f3-95d8-4d30-8ef5-f925e29aed3d" },
"consents": [
{
"channel": "phone",
"purpose": "contact",
"granted": true,
"wording": "I agree to be contacted about my enquiry.",
"language": "en"
}
]
}
Të detyrueshme janë vetëm type, dhe një email ose phone për personin.
| Fusha | Çfarë dërgohet |
|---|---|
type |
Çfarë ndodhi. Shihni llojet e ngjarjeve më poshtë. |
source |
Ku ishte personi, me fjalët tuaja. Shfaqet në CRM si burimi i kërkesës. Nëse lihet jashtë, përdoret emri i çelësit. |
occurredAt |
Kur ndodhi. Nëse lihet jashtë, tani. |
message |
Çfarë shkroi personi. Deri në 4.000 shenja. |
person |
name (ose firstName dhe lastName), email, phone dhe language. Një telefon pa kod shteti lexohet si numër i shtetit të agjencisë suaj. |
property |
Njoftimi për të cilin është. Për një nga njoftimet tuaja SADE, dërgoni { "id": "…" }: id-ja është pjesa e fundit e adresës së faqes së njoftimit në CRM. Për një njoftim diku tjetër, përshkruajeni në vend, me fusha si url, city dhe price; përshkrimi ruhet me ngjarjen. |
project |
Një projekt për të cilin është, si { "id": "…", "unitCode": "A-304" }. unitCode është opsional. |
page, campaign |
Ku ishte personi (url, title, referrer) dhe si arriti atje. |
consents |
Me çfarë ra dakord personi. Secili ka një channel (email, sms, whatsapp ose phone), një purpose (contact ose marketing), granted (true ose false), dhe, kur është dhënë, wording e saktë që pa. |
id |
Id-ja juaj për ngjarjen. E njëjta me header-in Idempotency-Key. |
Një çelës mund të emërtojë vetëm njoftimet dhe projektet tuaja. Emërtimi i atyre të një agjencie tjetër refuzohet.
Llojet e ngjarjeve
Ngjarjet e qëllimit janë dikush që kërkon të kontaktohet. Ato e krijojnë personin nëse nuk e keni ende, si kërkesë të re, dhe e shpërndajnë, e masin me kohë dhe e sinjalizojnë si çdo kërkesë:
registration, inquiry, property_inquiry, seller_inquiry, general_inquiry, incoming_call, visited_open_house.
Ngjarjet e sjelljes i shtohen vetëm kronologjisë së dikujt që e keni tashmë. Për një person që nuk e njihni, ato marrin përgjigjen ignored dhe nuk ruhet asgjë:
viewed_property, saved_property, property_search, saved_property_search, visited_website, viewed_page, unsubscribed.
Çfarë kthehet
{
"status": "created",
"eventId": "f1397256-2319-4810-a32b-4966c61777a9",
"personId": "ccb5e979-4b32-4283-997f-74cd01cc3675",
"inquiryId": "1b4a29af-d287-48d0-9399-32e75c3528de"
}
| Përgjigja | status |
Kuptimi |
|---|---|---|
| 201 | created |
U krijua një person i ri. |
| 200 | updated |
Ngjarja iu shtua një personi që e kishit tashmë. |
| 200 | duplicate |
Ky id u dërgua tashmë me këtë çelës. Nuk regjistrohet asgjë e re, dhe kthehen id-të e përgjigjes së parë. |
| 200 | ignored |
Një ngjarje sjelljeje për dikë që nuk e njihni. |
| 401 | Çelësi mungon, nuk njihet ose është revokuar. | |
| 422 | Diçka në ngjarje është e gabuar. message tregon çfarë. |
|
| 429 | Shumë kërkesa HTTP. Prisni sa sekonda tregon header-i Retry-After. |
inquiryId është null kur ngjarja nuk hapi asnjë pyetje për një njoftim.
Rregulla për dërguesit
- Dërgojeni çdo ngjarje një herë, në mënyrë të sigurt. Jepini çdo ngjarjeje një id, në header-in
Idempotency-Keyose siid, dhe dërgoni të njëjtën id kur provoni përsëri. CRM-ja e regjistron një herë. - Kufiri i shpeshtësisë. Çdo çelës mund të dërgojë 60 ngjarje në minutë.
- Një person, shumë ngjarje. Njerëzit përputhen brenda agjencisë suaj sipas emailit, pastaj sipas telefonit, cilado mënyrë që të shkruhet numri. Një ngjarje kurrë nuk mbishkruan atë që keni tashmë; plotëson vetëm ato që mungojnë.
- Kërkesat e dërguara me një çelës shpërndahen, maten me kohë dhe sinjalizohen si kërkesat nga marketplace, dhe nxisin webhook-et tuaja.
Webhook-et
Shtimi i një webhook-u
- Hapni Cilësimet → Integrimet dhe shkoni te karta Webhooks.
- Klikoni Shto webhook.
- Shkruani URL-në ku SADE CRM duhet t’i dërgojë kërkesat HTTP. Duhet të fillojë me
https://. - Poshtë Dërgo kur, shënoni Ndodh çdo gjë, edhe ngjarje që shtohen më vonë, ose shënoni ngjarjet që doni.
- Klikoni Shto webhook.
- Te rreshti i webhook-ut, klikoni Shfaq sekretin, pastaj Kopjo sekretin. Jepini zhvilluesit tuaj URL-në dhe sekretin.
- Klikoni Dërgo test dhe lexoni rezultatin.
URL-ja duhet të jetë një adresë publike https:// në internet, deri në 2.048 shenja. Adresat pa https://, adresat e rrjeteve private dhe adresat me emër përdoruesi ose fjalëkalim në to refuzohen.
Ngjarjet
| Kutiza | Ngjarja | Dërgohet kur |
|---|---|---|
| Shtohet një klient | person.created |
Krijohet një klient, nga një kërkesë ose me dorë në CRM. |
| Ndryshojnë të dhënat e një klienti | person.updated |
Ndryshon emri, emaili, telefoni, adresa ose qyteti i tij. |
| Ndryshon faza e një klienti | person.stage_changed |
Ndryshon faza e tij si kërkesë. change përmban from dhe to. |
| Një klient i caktohet një agjenti | person.assigned |
I jepet një agjenti tjetër, përfshirë kur një agjent e merr një kërkesë. change përmban id-të e përdoruesve from dhe to. |
| Një dublikatë bashkohet me një klient | person.merged |
Një administrator bashkon një dublikatë me të. mergedId është regjistrimi që nuk ekziston më. |
| Regjistrohet aktivitet për një klient (faqja, marketplace) | event.created |
Regjistrohet çdo kërkesë ose aktivitet për të, nga marketplace, një formular faqeje ose një çelës API. |
| Shkruhet një shënim | note.created |
Një agjent shkruan një shënim për të. |
Rreshti tregon ngjarjet që dëgjon një webhook, ose Të gjitha ngjarjet.
Si duket një dërgesë
Çdo dërgesë është një POST me një trup JSON si ky, për një ndryshim faze:
{
"id": "5a0e6c1e-8a4f-4f5b-9d43-1c2b7e9f0a11",
"event": "person.stage_changed",
"companyId": "3f7a1c28-6d0b-4f8e-a1c2-9b7d5e4f3a20",
"createdAt": "2026-11-05T14:54:12Z",
"data": {
"person": {
"id": "ccb5e979-4b32-4283-997f-74cd01cc3675",
"companyId": "3f7a1c28-6d0b-4f8e-a1c2-9b7d5e4f3a20",
"name": "Klea Muka",
"email": "[email protected]",
"phone": "+355684123377",
"stage": "spoke_with_customer",
"assignedAgentId": "8d2e4b61-0c3a-4f7e-b5d9-2a1c6e8f4b03",
"source": "tiranaliving.al",
"createdAt": "2026-11-05T14:41:07Z",
"lastActivityAt": "2026-11-05T14:53:58Z"
},
"change": { "from": "lead", "to": "spoke_with_customer" }
}
}
data.personështë në çdo ngjarjeperson.*. Fushat pa vlerë lihen jashtë.event.createddërgondata.event(llojin, burimin, mesazhin, njoftimin e kështu me radhë) dhedata.person.note.createde dërgon shënimin tedata:id,personId,text,authorUserIddhecreatedAt.- Fazat dërgohen me çelësat e tyre:
lead,attempted_contact,spoke_with_customer,appointment_set,met_with_customer,showing_homes,listing_agreement,active_listing,submitting_offers,under_contract,closed,nurturedhetrash. - Kohët janë në UTC.
Kërkesa mbart këto header-a:
X-Sade-Event: person.stage_changed
X-Sade-Delivery: 5a0e6c1e-8a4f-4f5b-9d43-1c2b7e9f0a11
X-Sade-Signature: t=1793890452,v1=9f3c…
User-Agent: SadeCRM-Webhooks/1.0
X-Sade-Delivery është i njëjtë me id. Dërgesat mund të arrijnë më shumë se një herë dhe jashtë radhe: përdorni X-Sade-Delivery për të hequr përsëritjet, dhe createdAt për t’i vënë në radhë.
Kontrolli i nënshkrimit
Çdo dërgesë nënshkruhet me sekretin e webhook-ut, që fillon me whsec_. Kontrolloni nënshkrimin para se t’i besoni një dërgese:
- Lexoni
t(një kohë në sekonda Unix) dhev1nga header-iX-Sade-Signature. - Llogaritni HMAC-SHA256 të tekstit
{t}.{raw body}(kohën, një pikë, pastaj trupin saktësisht siç u mor), me sekretin si çelës, të shkruar si heksadecimal me shkronja të vogla. - Krahasojeni me
v1, në kohë konstante. - Refuzojeni dërgesën nëse
tështë më i vjetër se pesë minuta.
Në Node.js:
import crypto from "node:crypto";
function isFromSade(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
return fresh && v1?.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}
Sekreti mund të shfaqet përsëri në çdo kohë me Shfaq sekretin. Nuk ka buton për ta ndryshuar: për të marrë një sekret të ri, fshini webhook-un dhe shtojeni përsëri, gjë që heq edhe historikun e dërgesave të tij.
Përgjigjja, riprovimet dhe çaktivizimi
- Përgjigjuni me çfarëdo statusi
2xxbrenda 10 sekondash. Çdo gjë tjetër llogaritet si dështim, dhe po ashtu një ridrejtim: ridrejtimet nuk ndiqen. - Një dërgesë e dështuar provohet përsëri me ndarje gjithnjë më të mëdha, deri në 9 përpjekje në rreth një orë e gjysmë.
- Pas 50 përpjekjesh të dështuara radhazi (çdo riprovim llogaritet si një), webhook-u e çaktivizon veten, Joaktiv, dhe karta shpjegon pse: “U çaktivizua pas 50 dërgesave të dështuara radhazi. Gabimi i fundit: …”. Rregulloni marrësin, pastaj aktivizojeni përsëri webhook-un. Aktivizimi e fillon numërimin nga e para.
- Sa kohë një webhook është joaktiv, nuk i dërgohet asgjë.
Testimi dhe regjistri i dërgesave
Dërgo test dërgon menjëherë një ngjarje ping, me data.message “A test from SADE CRM.” (një test nga SADE CRM), edhe kur webhook-u është joaktiv. Karta tregon “Testi u dërgua. Serveri juaj u përgjigj 200.” ose pse dështoi. Testet ping nuk renditen në regjistër dhe nuk llogariten si dështime.
Dërgesat e fundit hap 50 dërgesat e fundit, më e reja së pari, me Ngjarja, Statusi (Dërguar, Dështoi ose Në pritje), numrin e Përpjekje, Përgjigja që dha serveri juaj, dhe kur u Krijuar. Klikoni Rifresko për ta përditësuar.
Ndryshimi, ndalimi dhe fshirja
- Ndërruesi Aktiv / Joaktiv e ndalon një webhook pa humbur asgjë.
- Lapsi hap Ndrysho webhook-un për të ndryshuar URL-në ose ngjarjet.
- Koshi e fshin webhook-un. Nuk i dërgohet më asgjë, dhe historiku i dërgesave të tij hiqet.
Shembull
Tirana Living Real Estate ka faqen e vet, tiranaliving.al, me një formular kërkese vizite në çdo faqe njoftimi, ndërtuar nga projektuesi i saj. Ilir Dervishi krijon një çelës API me emrin “Faqja jonë (tiranaliving.al)” dhe ia jep projektuesit përmes menaxherit të fjalëkalimeve të agjencisë. Serveri i faqes tani e dërgon çdo kërkesë si property_inquiry me id-në e njoftimit dhe pëlqimin e vizitorit. Kur Klea Muka pyet për “Apartament 2+1 në Bllok” në orën 15:41, ajo arrin si kërkesë e re me burimin tiranaliving.al, të njëjtin burim me formularin e faqes të agjencisë. Rregulli i shpërndarjes për atë burim ia ofron Arta Krasniqit dhe Besnik Lekës, dhe Arta e merr.
Agjencia i mban llogaritë e saj edhe në një sistem të veçantë dhe do të dijë kur një klient arrin në Mbyllur. Ilir klikon Shto webhook, shkruan https://hooks.tiranaliving.al/sade, shënon Ndryshon faza e një klienti, dhe klikon Shto webhook. Kopjon sekretin për projektuesin dhe klikon Dërgo test: “Testi u dërgua. Serveri juaj u përgjigj 200.”
Kur Arta e kalon Kleën në Bisedë me klientin në orën 15:54, sistemi i llogarive merr person.stage_changed me "from": "lead" dhe "to": "spoke_with_customer", kontrollon nënshkrimin, dhe e injoron, sepse vepron vetëm për "to": "closed".
Diçka e paqartë apo që mungon? Shkruani në [email protected] ose telefononi në +355 69 808 0118.