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).
https://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:
# 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.
.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ı.
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.
ownerEmail gönderiyorsanız adres değiştiğinde entegrasyondaki değeri de güncelleyin — eski adres artık eşleşmez.Uçlar
/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.
/v1/entegrasyon/referansId 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.
/v1/entegrasyon/ilanlarİlan oluşturur. Başarılı yanıt 201 döner.
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"
}'/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.
/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.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
taxNumber | string | evet | İ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" |
ownerEmail | string (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]" |
externalId | string (≤120) | hayır | Sizin 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ı
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
adType | enum | evet | İ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" |
title | string (10-150) | evet | İlan başlığı. örn. "Ankara-Konya güzergâhında 27 kişilik servis aracı aranıyor" |
description | string (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.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
categoryId | integer | hayır | Taşımacılık kategorisi. |
vehicleTypeId | integer | hayır | Araç tipi (minibüs, otobüs, kamyon…). |
visibility | "PUBLIC" | "PRIVATE" | hayır | Varsayı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.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
cityId | integer | hayır | İlanın ili. |
districtId | integer | hayır | İlanın ilçesi. |
routeFromCityId | integer | hayır | Güzergâhın başlangıç ili — haritadaki konum bundan çıkar. |
routeFromDistrictId | integer | hayır | Başlangıç ilçesi. |
routeToCityId | integer | hayır | Güzergâhın varış ili. |
routeToDistrictId | integer | hayır | Varış ilçesi. |
routeFrom | string (≤120) | hayır | Serbest metin başlangıç tarifi. örn. "Sincan OSB" |
routeTo | string (≤120) | hayır | Serbest metin varış tarifi. |
preferredLocation | string (≤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.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
priceAmount | number | hayır | Ücret / fiyat (TRY). Boş bırakılırsa sitede fiyat hiç gösterilmez. |
capacityTons | number | hayır | Kapasite (ton). |
experienceYearsMin | integer | hayır | Aranan en az deneyim (yıl). |
requiredLicenseClassId | integer | hayır | Aranan ehliyet sınıfı. |
startDate | YYYY-MM-DD | hayır | İşin başlangıç tarihi. |
endDate | YYYY-MM-DD | hayır | Bitiş tarihi. Başlangıçtan önce olamaz. |
shiftStartTime | HH:MM | koşullu | Vardiya başlangıcı. Bitişle birlikte girilmeli. |
shiftEndTime | HH:MM | koşullu | Vardiya bitişi. |
İletişim
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
contactName | string (≤120) | hayır | İlana özel iletişim kişisi. Boşsa firmanın bilgileri gösterilir. |
contactPhone | string | hayır | İlana özel telefon (05XX…). |
hideContactFromPublic | boolean | hayır | Varsayı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.
{
"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.
| Durum | code | Anlamı |
|---|---|---|
| 401 | UNAUTHORIZED | Gizli sözcük eksik ya da geçersiz |
| 503 | NOT_CONFIGURED | Entegrasyon bu kurulumda yapılandırılmamış |
| 403 | IP_NOT_ALLOWED | Bu IP adresinden istek kabul edilmiyor |
| 403 | COMPANY_INACTIVE | Firma hesabı aktif değil (onay bekliyor ya da askıda) |
| 422 | COMPANY_NOT_FOUND | Bu vergi numarasına ait kayıtlı firma yok |
| 422 | COMPANY_AMBIGUOUS | Bu vergi numarası birden fazla firmada kayıtlı |
| 422 | COMPANY_NO_MEMBER | Firmanın ilan açabilecek aktif bir yetkilisi yok |
| 422 | OWNER_NOT_FOUND | ownerEmail bu firmanın aktif bir üyesine ait değil |
| 422 | VALIDATION | Gönderilen alanlar geçersiz |
| 404 | NOT_FOUND | Kayıt bulunamadı |
| 429 | RATE_LIMITED | Çok fazla istek gönderildi |
{
"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
429dö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.
