Başlarken

Kendi yazılımınızdan (filo takip, ERP, ön muhasebe ya da kendi siteniz) doğrudan ilan açabilir, açtığınız ilanların durumunu okuyabilirsiniz. Site üzerinden açılan ilanlarla aynı kurallara tabidir — moderasyon açıksa API'den gelen ilan da incelemeye düşer.

Panelden anahtar üretmek gerekmez. İki şey yeterli: gizli sözcük (isteğin bize ait olduğunu kanıtlar) ve vergi numarası (ilanın hangi firmaya açılacağını belirler).

Temel adreshttps://servis.alcom.dev/apiTüm uçlar bu adresin altındadır. Yalnızca HTTPS.

Kurulum

Sunucu yöneticisi .env dosyasına iki değer yazar ve konteynerleri yeniden başlatır:

.env
# Rastgele, en az 32 karakter. Uretmek icin:  openssl rand -base64 48
INTEGRATION_SECRET=uzun-ve-rastgele-bir-gizli-sozcuk-buraya

# Istege bagli: yalnizca bu vergi numaralari adina ilan acilabilir.
# Bos birakilirsa numarasi kayitli her onayli firma kullanilabilir.
INTEGRATION_ALLOWED_TAX_NUMBERS=

# Istege bagli: yalnizca bu IP adreslerinden gelen istekler kabul edilir.
INTEGRATION_ALLOWED_IPS=

Aynı gizli sözcük, istek gönderen programın yapılandırmasına da yazılır. Tanımlı değilse entegrasyon uçları kapalıdır ve 503 döner — yapılandırılmamış bir ucun korumasız açık kalmaması için.

Ayrıca firmanın vergi numarası panelde kayıtlı olmalı: Firma bilgileri sayfasındaki “Vergi numarası” alanı. Numara girilmemişse eşleştirme yapılamaz ve istek 422 COMPANY_NOT_FOUND alır.

Gizli sözcüğü koruyunOnu taşıyan her istek firmanız adına ilan açabilir. Kaynak koda, paylaşılan belgelere ya da istemci tarafı bir uygulamaya (tarayıcı, mobil uygulama) koymayın — yalnızca sunucudan sunucuya kullanın. Sızdığından şüphelenirseniz .env içindeki değeri değiştirip konteynerleri yeniden başlatmak yeterli: eski sözcük anında geçersiz olur.

Kimlik doğrulama

Her isteğe X-Integration-Secret başlığını ekleyin; değer INTEGRATION_SECRET ile birebir aynı olmalı.

istek
curl -X GET "https://servis.alcom.dev/api/v1/entegrasyon/firma?taxNumber=1234567890" \
  -H "X-Integration-Secret: $SERVISILAN_SECRET"

Sözcük Authorization başlığında taşınmaz: o başlığı sitenin oturum katmanı kullanıyor ve iki ayrı kimlik mekanizmasının aynı başlığı paylaşması okuyanı yanıltır.

Firma eşleştirme

Her istek bir taxNumber taşır. Sunucu bu numaraya ait kayıtlı bir firma arar:

  • Firma bulunduysa ilan o firmanın adına açılır.
  • Bulunamadıysa ilan açılmaz — 422 COMPANY_NOT_FOUND. Firmanın panelde vergi numarasını kaydetmiş olması gerekir.
  • Firma onaylı değilse (başvuru bekliyor ya da askıda) 403 COMPANY_INACTIVE.

Karşılaştırma yalnızca rakamlar üzerinden yapılır: "123 456 7890", "1234567890" ile aynı sayılır. Bir vergi numarası sitede yalnızca bir firmaya kayıtlı olabilir.

İlan kimin adına yazılır?

İlanın sitede bir sahibi olmak zorundadır. ownerEmail göndermezseniz ilan firmanın yetkilisine yazılır — çoğu kurulum için doğrusu budur. Belirli bir kişiye yazılmasını istiyorsanız o üyenin e-posta adresini gönderin; adres o firmanın aktif bir üyesine ait değilse istek 422 OWNER_NOT_FOUND ile reddedilir, ilan yanlış hesaba açılmaz. Kullanılabilir adresleri GET /v1/entegrasyon/firma ucu listeler.

E-posta adresi değişirseÜye e-posta adresini panelden değiştirebilir; değişiklik yeni adrese gönderilen doğrulama koduyla tamamlanır. ownerEmail gönderiyorsanız adres değiştiğinde entegrasyondaki değeri de güncelleyin — eski adres artık eşleşmez.

Uçlar

GET/v1/entegrasyon/firma?taxNumber=…

Vergi numarasının karşılığı olan firmayı tüm bilgileriyle ve ilan açılabilecek üye adreslerini döndürür. Kurulumdan sonra ilk çağıracağınız uç: numaranın doğru firmaya denk geldiğini ilan göndermeden önce doğrular.

GET/v1/entegrasyon/referans

Id gerektiren alanların sözlükleri: ilan tipleri, kategoriler, araç tipleri, ehliyet sınıfları, iller ve ilçeleri. Günde bir kez çekip önbelleğe almanız yeterli.

POST/v1/entegrasyon/ilanlar

İlan oluşturur. Başarılı yanıt 201 döner.

istek
curl -X POST "https://servis.alcom.dev/api/v1/entegrasyon/ilanlar" \
  -H "X-Integration-Secret: $SERVISILAN_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "taxNumber": "1234567890",
    "externalId": "ILAN-2026-00412",
    "adType": "VEHICLE_WANTED",
    "title": "Ankara-Konya güzergahinda 27 kisilik servis araci araniyor",
    "description": "Hafta ici sabah ve aksam personel servisi icin arac ariyoruz.",
    "vehicleTypeId": 3,
    "cityId": 6,
    "routeFromCityId": 6,
    "routeToCityId": 42,
    "priceAmount": 85000,
    "shiftStartTime": "07:00",
    "shiftEndTime": "18:30",
    "contactName": "Operasyon",
    "contactPhone": "05001112233"
  }'
GET/v1/entegrasyon/ilanlar?taxNumber=…

O firmanın API üzerinden açılmış ilanlarını listeler. ?limit= (1-200, varsayılan 50) ve ?status= ile daraltılır.

GET/v1/entegrasyon/ilanlar/:ref?taxNumber=…

Tek ilan. :ref iki biçimi kabul eder: sitenin ilan id'si, ya da ext: öneki ile sizin kendi numaranız — örneğin /v1/entegrasyon/ilanlar/ext:ILAN-2026-00412?taxNumber=1234567890. Böylece site id'sini kendi tarafınızda saklamak zorunda kalmazsınız. Vergi numarası burada da gerekli: dış numara yalnızca firma içinde tekildir.

İlan alanları

İlan gövdesi aşağıdaki alanları kabul eder. Tanınmayan alanlar yok sayılır. companyId gönderilmez — firmayı vergi numarası belirler.

Eşleştirme

Firma vergi numarasıyla bulunur; ilan o firmanın adına açılır.

AlanTipZorunluAçıklama
taxNumberstringevetİlanın açılacağı firmanın vergi numarası (VKN). Boşluk ve noktalama serbest, karşılaştırma yalnızca rakamlar üzerinden yapılır. Bu numaraya ait kayıtlı bir firma yoksa ilan açılmaz. örn. "1234567890"
ownerEmailstring (e-posta)hayırİlan hangi üye adına yazılsın. Verilirse o firmanın AKTİF bir üyesinin adresi olmalı; verilmezse ilan firmanın yetkilisine yazılır. Kullanılabilir adresleri /firma ucundan alabilirsiniz. örn. "[email protected]"
externalIdstring (≤120)hayırSizin sistemenizdeki kayıt numarası. Verirseniz istek tekrarlanabilir olur: aynı numarayla ikinci istek yeni ilan açmaz, mevcut ilanı döndürür (created: false). örn. "ILAN-2026-00412"
Zorunlu ilan alanları
AlanTipZorunluAçıklama
adTypeenumevetİlan tipi. Firma adına açılan ilanlarda yalnızca araç/şoför ARAYAN tipler ve alım-satım tipleri geçerlidir. örn. "VEHICLE_WANTED"
titlestring (10-150)evetİlan başlığı. örn. "Ankara-Konya güzergâhında 27 kişilik servis aracı aranıyor"
descriptionstring (20-8000)evetİlan açıklaması. Düz metin; HTML etiketleri işlenmez.
Sınıflandırma

Id değerleri /referans ucundan alınır.

AlanTipZorunluAçıklama
categoryIdintegerhayırTaşımacılık kategorisi.
vehicleTypeIdintegerhayırAraç tipi (minibüs, otobüs, kamyon…).
visibility"PUBLIC" | "PRIVATE"hayırVarsayılan PUBLIC. PRIVATE ilan yalnızca firmanızın ağındaki üyelere görünür.
Konum ve güzergâh

Güzergâh alanları YALNIZCA araç/şoför arayan ilanlarda kabul edilir; çalışma bölgesi ise yalnızca iş arayan ilanlarda.

AlanTipZorunluAçıklama
cityIdintegerhayırİlanın ili.
districtIdintegerhayırİlanın ilçesi.
routeFromCityIdintegerhayırGüzergâhın başlangıç ili — haritadaki konum bundan çıkar.
routeFromDistrictIdintegerhayırBaşlangıç ilçesi.
routeToCityIdintegerhayırGüzergâhın varış ili.
routeToDistrictIdintegerhayırVarış ilçesi.
routeFromstring (≤120)hayırSerbest metin başlangıç tarifi. örn. "Sincan OSB"
routeTostring (≤120)hayırSerbest metin varış tarifi.
preferredLocationstring (≤120)hayırÇalışma bölgesi tercihi (yalnızca iş arayan ilanlarda).
İş koşulları

Satılık/kiralık ilanlarda vardiya saati, deneyim ve belge alanları kabul edilmez.

AlanTipZorunluAçıklama
priceAmountnumberhayırÜcret / fiyat (TRY). Boş bırakılırsa sitede fiyat hiç gösterilmez.
capacityTonsnumberhayırKapasite (ton).
experienceYearsMinintegerhayırAranan en az deneyim (yıl).
requiredLicenseClassIdintegerhayırAranan ehliyet sınıfı.
startDateYYYY-MM-DDhayırİşin başlangıç tarihi.
endDateYYYY-MM-DDhayırBitiş tarihi. Başlangıçtan önce olamaz.
shiftStartTimeHH:MMkoşulluVardiya başlangıcı. Bitişle birlikte girilmeli.
shiftEndTimeHH:MMkoşulluVardiya bitişi.
İletişim
AlanTipZorunluAçıklama
contactNamestring (≤120)hayırİlana özel iletişim kişisi. Boşsa firmanın bilgileri gösterilir.
contactPhonestringhayırİlana özel telefon (05XX…).
hideContactFromPublicbooleanhayırVarsayılan true. true iken iletişim bilgisi yalnızca giriş yapmış kullanıcılara gösterilir.

Tekrarlanan istekler

Ağ koptuğunda yanıtı alamayabilirsiniz — ama ilan açılmış olabilir. externalId göndererek bu durumu güvenle çözersiniz: aynı numarayla ikinci istek yeni ilan açmaz, mevcut ilanı created: false ile geri verir. Numara yalnızca sizin firmanız içinde tekildir.

Yanıt içeriği

Her ilan yanıtı üç bloktan oluşur: ad (ilanın tüm alanları, id'lerin yanında adlarıyla), owner (ilanı taşıyan üye) ve company (firmanın tüm bilgileri). Böylece dönen kaydı kendi ekranınızda göstermek için ayrıca sözlük çekmeniz gerekmez.

yanıt
{
  "created": true,
  "ad": {
    "id": "6f1c…", "referenceCode": "SI-4A2B9C11", "slug": "ankara-konya-…",
    "url": "https://servis.alcom.dev/ilan/ankara-konya-…",
    "externalId": "ILAN-2026-00412",
    "status": "PENDING_REVIEW", "statusLabel": "İncelemede",
    "adType": "VEHICLE_WANTED", "adTypeLabel": "İşime araç arıyorum",
    "visibility": "PUBLIC",
    "title": "…", "description": "…",
    "vehicleType": { "id": 3, "name": "Otobüs" },
    "city": { "id": 6, "name": "Ankara" }, "district": null,
    "routeFrom": { "city": { "id": 6, "name": "Ankara" }, "district": null, "text": null },
    "routeTo":   { "city": { "id": 42, "name": "Konya" }, "district": null, "text": null },
    "priceAmount": 85000, "shiftStartTime": "07:00", "shiftEndTime": "18:30",
    "contactName": "Operasyon", "contactPhone": "05001112233",
    "publishedAt": null, "expiresAt": null,
    "createdAt": "2026-09-08T08:12:44.512Z", "updatedAt": "2026-09-08T08:12:44.512Z"
  },
  "owner": {
    "id": "9ab3…", "email": "[email protected]",
    "fullName": "Örnek Firma Operasyon", "phone": "05001112233", "companyRole": "ADMIN"
  },
  "company": {
    "id": "1c4d…", "name": "Örnek Taşımacılık A.Ş.", "slug": "ornek-tasimacilik",
    "url": "https://servis.alcom.dev/firma/ornek-tasimacilik",
    "legalName": "Örnek Taşımacılık Anonim Şirketi",
    "taxNumber": "1234567890", "taxOffice": "Çankaya",
    "contactEmail": "[email protected]", "contactPhone": "03121112233",
    "phones": ["03121112233", "05001112233"],
    "city": { "id": 6, "name": "Ankara" }, "district": { "id": 88, "name": "Çankaya" },
    "employeeCount": 45, "fleetSize": 30,
    "status": "APPROVED", "isVerified": true, "defaultAdVisibility": "PUBLIC"
  }
}

Moderasyon açıkken yeni ilan PENDING_REVIEW durumunda başlar ve onaylandığında PUBLISHED olur. Durumu GET /v1/entegrasyon/ilanlar/ext:… ile sorgulayabilirsiniz.

Hatalar

Hata yanıtları message ve — ayırt etmeniz gereken durumlarda — sabit bir code taşır. Alan bazlı doğrulama hataları errors nesnesinde alan adıyla döner.

DurumcodeAnlamı
401UNAUTHORIZEDGizli sözcük eksik ya da geçersiz
503NOT_CONFIGUREDEntegrasyon bu kurulumda yapılandırılmamış
403IP_NOT_ALLOWEDBu IP adresinden istek kabul edilmiyor
403COMPANY_INACTIVEFirma hesabı aktif değil (onay bekliyor ya da askıda)
422COMPANY_NOT_FOUNDBu vergi numarasına ait kayıtlı firma yok
422COMPANY_AMBIGUOUSBu vergi numarası birden fazla firmada kayıtlı
422COMPANY_NO_MEMBERFirmanın ilan açabilecek aktif bir yetkilisi yok
422OWNER_NOT_FOUNDownerEmail bu firmanın aktif bir üyesine ait değil
422VALIDATIONGönderilen alanlar geçersiz
404NOT_FOUNDKayıt bulunamadı
429RATE_LIMITEDÇok fazla istek gönderildi
422 · doğrulama
{
  "statusCode": 422,
  "code": "VALIDATION",
  "message": "Gönderilen alanlar geçersiz",
  "errors": {
    "title": ["Başlık en az 10 karakter"],
    "adType": ["Bu ilan tipi seçilen hesap için geçerli değil: firma adına araç/şoför aranır, bireysel olarak iş aranır"]
  }
}

Sınırlar

  • Dakikada 300 istek. Aşıldığında 429 döner.
  • İstek gövdesi en fazla 1 MB.
  • İlan görselleri şu an API ile yüklenemez; ilan açıldıktan sonra panelden eklenir.
  • Bu sürümde ilan oluşturma ve okuma desteklenir; güncelleme ve silme panelden yapılır.

Entegrasyon sırasında takıldığınız bir yer olursa [email protected] adresine yazın; isteğinizin gövdesini ve dönen hata metnini eklerseniz daha hızlı yanıt veririz.