Package Exports
- schengen-randevu-checker
- schengen-randevu-checker/dist/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (schengen-randevu-checker) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
๐ Schengen Visa
Modern TypeScript library for checking Schengen visa appointment availability across 17+ countries. Built with type safety, rate limiting, and error handling.
โ ๏ธ Legal Disclaimer
This library is for educational and informational purposes only.
- โ Does NOT create official appointments
- โ Does NOT automate booking systems
- โ Does NOT interfere with embassy systems
Always use official channels for visa appointments!
๐ Installation
npm install schengen-randevu-checker๐ Quick Start
TypeScript
import { SchengenChecker } from 'schengen-randevu-checker';
const checker = new SchengenChecker({
sehir: 'ankara',
rateLimit: 2000,
cache: {
enabled: true,
ttl: 5 * 60 * 1000, // 5 minutes
maxSize: 100
},
enableStatistics: true
});
// Check single country (first call - cache miss)
const result1 = await checker.musaitRandevuKontrol('fransa'); // ~300ms
console.log(result1);
// Check again (cache hit - blazing fast!)
const result2 = await checker.musaitRandevuKontrol('fransa'); // ~0.03ms
// Get statistics
const stats = checker.getStatistics();
console.log(`Success Rate: ${checker.getSuccessRate()}%`);
console.log(`Cache Hit Rate: ${checker.getCacheHitRate()}%`);
console.log(`Avg Response Time: ${stats.averageResponseTime}ms`);JavaScript (CommonJS)
const { SchengenChecker } = require('schengen-randevu-checker');
const checker = new SchengenChecker({ sehir: 'ankara' });
checker.musaitRandevuKontrol('fransa').then(result => {
console.log(result);
});๐ Supported Countries (18)
| Country | Code | Cities |
|---|---|---|
| ๐ซ๐ท France | fransa |
Ankara, Istanbul, Izmir |
| ๐ณ๐ฑ Netherlands | hollanda |
Ankara, Istanbul |
| ๐ฉ๐ช Germany | almanya |
Ankara, Istanbul, Izmir |
| ๐ช๐ธ Spain | ispanya |
Ankara, Istanbul, Izmir |
| ๐ฎ๐น Italy | italya |
Ankara, Istanbul, Izmir |
| ๐ธ๐ช Sweden | isvec |
Ankara, Istanbul |
| ๐จ๐ฟ Czech Republic | cekyarepublik |
Ankara, Istanbul |
| ๐ญ๐ท Croatia | hirvatistan |
Ankara |
| ๐ง๐ฌ Bulgaria | bulgaristan |
Ankara, Istanbul |
| ๐ซ๐ฎ Finland | finlandiya |
Ankara, Istanbul |
| ๐ธ๐ฎ Slovenia | slovenya |
Ankara |
| ๐ฉ๐ฐ Denmark | danimarka |
Ankara, Istanbul |
| ๐ณ๐ด Norway | norvec |
Ankara, Istanbul |
| ๐ช๐ช Estonia | estonya |
Ankara |
| ๐ฑ๐น Lithuania | litvanya |
Ankara |
| ๐ฑ๐บ Luxembourg | luksemburg |
Ankara |
| ๐ฑ๐ป Latvia | letonya |
Ankara |
| ๐ต๐ฑ Poland | polonya |
Ankara, Istanbul |
๐ What's New in v2.2.0
- โก In-Memory Caching - Blazing fast repeated checks (300ms โ 0.03ms)
- ๐ Statistics Tracking - Monitor success rates, response times, and usage
- ๐ฏ Performance Monitoring - Track cache hit rates and average response times
- ๐ง Configurable Cache - Customize TTL, size, and enable/disable on the fly
Previous Releases
v2.1.0:
- โ Contact Information - Embassy/consulate contact details
- โ Visa Requirements - Detailed visa requirements for each country
- โ Document Checklist - Complete document checklist for applications
- โ Comprehensive Country Info - All information in one call
๐ API Reference
Constructor
new SchengenChecker(options?: SchengenCheckerOptions)Options:
sehir?: string- Default city (default:'ankara')rateLimit?: number- Delay between requests in ms (default:2000)cache?: CacheOptions- Cache configurationenabled?: boolean- Enable/disable cache (default:true)ttl?: number- Time to live in ms (default:300000- 5 minutes)maxSize?: number- Maximum cache entries (default:100)
enableStatistics?: boolean- Enable statistics tracking (default:true)
Methods
musaitRandevuKontrol(ulke: string, options?: KontrolOptions): Promise<RandevuKontrolSonuc>
Check appointment availability for a single country.
const result = await checker.musaitRandevuKontrol('fransa', {
sehir: 'istanbul',
vizeTipi: 'turist'
});topluRandevuKontrol(ulkeler: string[], options?: KontrolOptions): Promise<RandevuKontrolSonuc[]>
Check multiple countries with rate limiting.
const results = await checker.topluRandevuKontrol([
'fransa',
'hollanda',
'almanya'
]);tumUlkelerKontrol(options?: KontrolOptions): Promise<RandevuKontrolSonuc[]>
Check all supported countries.
const allResults = await checker.tumUlkelerKontrol();vizeMerkeziBilgisi(ulke: string): VizeMerkezi | null
Get visa center information for a country.
const info = checker.vizeMerkeziBilgisi('fransa');
// {
// ulke: 'fransa',
// url: 'https://france-visas.gouv.fr/...',
// tip: 'vfs-global',
// sehirler: ['ankara', 'istanbul', 'izmir'],
// telefonlar: { ankara: '+90 312 455 4545', ... }
// }vizeMerkezleriListele(): Array<VizeMerkezi & { ulke: string }>
List all visa centers.
const centers = checker.vizeMerkezleriListele();sehreGoreVizeMerkezleri(sehir: string): Array<...>
Filter visa centers by city.
const ankaraCenters = checker.sehreGoreVizeMerkezleri('ankara');getAllCountries(): CountryConfig[]
Get all country configurations with detailed information.
const countries = checker.getAllCountries();
// Returns array of all 17 countries with flags, providers, URLsgetCountryById(countryId: string): CountryConfig | undefined
Get country configuration by ISO code.
const france = checker.getCountryById('fr');
// { id: 'fr', name: 'Fransa', flag: '๐ซ๐ท', provider: 'TLScontact', ... }getCountryByName(countryName: string): CountryConfig | undefined
Get country configuration by name.
const spain = checker.getCountryByName('ฤฐspanya');getCountriesByProvider(provider: string): CountryConfig[]
Filter countries by visa service provider.
const vfsCountries = checker.getCountriesByProvider('VFS Global');
// Returns all countries using VFS GloballistCountriesWithFlags(): Array<{ id, name, flag, provider }>
Get a simplified list of countries with flags.
const list = checker.listCountriesWithFlags();
// [{ id: 'fr', name: 'Fransa', flag: '๐ซ๐ท', provider: 'TLScontact' }, ...]๐ New Methods (v2.1.0)
getContactInfo(countryId: string, city?: string): ContactInfo[]
Get embassy/consulate contact information.
// Get all contacts for a country
const contacts = checker.getContactInfo('fr');
// Get contacts for specific city
const ankaraContact = checker.getContactInfo('de', 'ankara');
console.log(ankaraContact[0].phone); // +90 312 455 51 00
console.log(ankaraContact[0].address);
console.log(ankaraContact[0].workingHours);getVisaRequirements(countryId: string, visaType?: string): VisaRequirements
Get detailed visa requirements.
const requirements = checker.getVisaRequirements('fr', 'tourist');
console.log(requirements.processingTime); // "15 iล gรผnรผ"
console.log(requirements.visaFee); // "80 EUR (yetiลkin)"
console.log(requirements.requiredDocuments); // Array of required documents
console.log(requirements.additionalInfo); // Tips and notesgetDocumentChecklist(countryId: string, visaType?: string): DocumentChecklist
Get complete document checklist for visa application.
const checklist = checker.getDocumentChecklist('de', 'tourist');
console.log(checklist.mandatory); // Required documents
console.log(checklist.optional); // Optional documents
console.log(checklist.tips); // Application tips
// Example output:
// {
// name: 'Pasaport',
// description: 'En az 3 ay geรงerli, 2 boล sayfa',
// format: 'Orijinal + fotokopi',
// quantity: 1
// }getCountryFullInfo(countryId: string): FullCountryInfo
Get all information about a country in one call.
const fullInfo = checker.getCountryFullInfo('fr');
console.log(fullInfo.config); // Country configuration
console.log(fullInfo.contacts); // Contact information
console.log(fullInfo.requirements); // Visa requirements
console.log(fullInfo.checklist); // Document checklist
console.log(fullInfo.hasFullInfo); // true if all data available๐ Cache & Statistics Methods (v2.2.0)
getCacheStats(): CacheStats
Get cache statistics.
const stats = checker.getCacheStats();
console.log(stats.size); // Current cache size
console.log(stats.hits); // Cache hits
console.log(stats.misses); // Cache misses
console.log(stats.hitRate); // Hit rate percentageclearCache(): void
Clear all cached data.
checker.clearCache();setCacheEnabled(enabled: boolean): void
Enable or disable caching.
checker.setCacheEnabled(false); // Disable cache
checker.setCacheEnabled(true); // Enable cachesetCacheTTL(ttl: number): void
Set cache time-to-live in milliseconds.
checker.setCacheTTL(10 * 60 * 1000); // 10 minutesgetStatistics(): Statistics
Get comprehensive statistics.
const stats = checker.getStatistics();
console.log(stats.totalChecks);
console.log(stats.successfulChecks);
console.log(stats.averageResponseTime);
console.log(stats.mostCheckedCountries); // Top 10 countriesgetCountryStatistics(country: string): CountryStat
Get statistics for a specific country.
const franceStats = checker.getCountryStatistics('fransa');
console.log(franceStats.checkCount);
console.log(franceStats.successRate);
console.log(franceStats.averageResponseTime);getSuccessRate(): number
Get overall success rate percentage.
const rate = checker.getSuccessRate(); // e.g., 85.5getCacheHitRate(): number
Get cache hit rate percentage.
const hitRate = checker.getCacheHitRate(); // e.g., 75.0resetStatistics(): void
Reset all statistics.
checker.resetStatistics();๐ง TypeScript Types
interface RandevuKontrolSonuc {
ulke: string;
sehir?: string;
vizeTipi?: string;
durum: 'musait' | 'dolu' | 'bilinmiyor' | 'hata' | 'timeout';
mesaj: string;
url: string;
siteErisilebilir?: boolean;
httpDurum?: number;
kontrolTarihi: Date;
not?: string;
}
interface VizeMerkezi {
url: string;
tip: 'vfs-global' | 'bls-international' | 'konsolosluk';
sehirler: string[];
telefonlar: Record<string, string>;
}
interface CountryConfig {
id: string; // ISO country code (e.g., 'fr', 'de')
name: string; // Country name in Turkish
flag: string; // Country flag emoji
provider: string; // Visa service provider
bookingBaseUrl: string; // Base URL for appointments
notes?: string; // Additional information
}โจ Features
- โ TypeScript First - Full type safety and IntelliSense support
- โ Rate Limiting - Built-in delays to respect server resources
- โ Error Handling - Comprehensive error management
- โ Timeout Protection - 10-second timeout for all requests
- โ 17+ Countries - Support for major Schengen countries
- โ Multiple Cities - Ankara, Istanbul, Izmir support
- โ Modern ES2020 - Clean, modern JavaScript
๐ก๏ธ Best Practices
// โ
Good: Use rate limiting
const checker = new SchengenChecker({ rateLimit: 2000 });
// โ
Good: Handle errors
try {
const result = await checker.musaitRandevuKontrol('fransa');
} catch (error) {
console.error('Check failed:', error);
}
// โ
Good: Use for educational purposes
const info = checker.vizeMerkeziBilgisi('fransa');
console.log('Contact:', info.telefonlar.ankara);
// โ Bad: Don't spam requests
// โ Bad: Don't use for automated booking
// โ Bad: Don't bypass official systems๐ฆ Package Info
- Size: ~50KB (minified)
- Dependencies: axios
- Node.js: >=18.0.0
- TypeScript: >=5.0.0
๐ Migration from v1.x
// v1.x (JavaScript)
const SchengenRandevu = require('schengen-randevu-checker');
const checker = new SchengenRandevu({ ulke: 'fransa' });
// v2.x (TypeScript)
import { SchengenChecker } from 'schengen-randevu-checker';
const checker = new SchengenChecker({ sehir: 'ankara' });๐ง Troubleshooting
Germany (Almanya) Timeout Issues
If you're experiencing timeout errors with Germany:
// Result: { durum: 'timeout', mesaj: 'Site yanฤฑt vermiyor (timeout)' }Possible Causes:
- Bot Protection - German embassy website uses anti-bot measures
- Network Environment - WSL, Docker, or restrictive networks may block requests
- Slow Response - Government sites can be slow (we use 30s timeout)
Solutions:
// 1. Increase timeout (if needed)
const checker = new SchengenChecker({
// Note: Timeout is already 30s by default
cache: {
enabled: true,
ttl: 10 * 60 * 1000 // Cache for 10 minutes
}
});
// 2. Use cache to reduce requests
const result = await checker.musaitRandevuKontrol('almanya');
// Second call will be instant from cache
// 3. Check if site is accessible
const info = checker.vizeMerkeziBilgisi('almanya');
console.log('Try accessing:', info.url);
// Open in browser to verifyAlternative Approaches:
- Use the official iDATA website directly
- Check from a different network/VPN
- Use browser automation tools (Puppeteer/Playwright) for better bot evasion
Other Common Issues
403 Forbidden Errors:
- Some sites block automated requests
- Try with different User-Agent or from browser
Rate Limiting:
- Use built-in rate limiting:
rateLimit: 3000(3 seconds between requests) - Enable caching to reduce API calls
๐ค Contributing
Contributions are welcome! Please read our contributing guidelines.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing) - Commit your changes (
git commit -m 'feat: Add amazing feature') - Push to the branch (
git push origin feature/amazing) - Open a Pull Request
๐ License
MIT ยฉ ฤฐhsan Baki Doฤan
๐ Links
- GitHub: https://github.com/ibidi/schengen-visa
- npm: https://www.npmjs.com/package/schengen-randevu-checker
- Issues: https://github.com/ibidi/schengen-visa/issues
๏ฟฝ C hangelog
[2.0.0] - 2025-11-13
๐ Major Release - TypeScript Rewrite
Added
- โ Full TypeScript support with type definitions
- โ Modern ES2020 syntax
- โ Comprehensive type safety
- โ 17+ Schengen countries support
- โ Rate limiting built-in
- โ Timeout protection (10s)
- โ Better error handling
- โ Multiple city support (Ankara, Istanbul, Izmir)
Changed
- ๐ Complete rewrite from JavaScript to TypeScript
- ๐ Improved API design
- ๐ Better naming conventions
- ๐ Enhanced documentation
Breaking Changes
- โ ๏ธ Constructor options changed
- โ ๏ธ Method signatures updated
- โ ๏ธ Response types restructured
Migration Guide:
// v1.x
const checker = new SchengenRandevu({ ulke: 'fransa' });
// v2.x
const checker = new SchengenChecker({ sehir: 'ankara' });[1.2.0] - 2025-11-13
Added
- Database support (MongoDB, Supabase)
- Export/Import functionality (JSON, CSV)
- Statistics and analytics
- Personal appointment tracking
[1.0.0] - 2025-11-13
Initial Release
- Basic appointment checking
- JavaScript implementation
- 25+ Schengen countries support
- VFS Global, BLS International support
๐จโ๐ป Author
ฤฐhsan Baki Doฤan
- Email: info@ihsanbakidogan.com
- GitHub: @ibidi
โญ If you find this library helpful, please give it a star on GitHub!