Unified .NET client for APILayer marketplace APIs. Access IP geolocation, currency exchange rates, phone validation, email verification, and more with one API key. Supports IPstack, Currencylayer, Numverify, Mailboxlayer, and 15+ other APIs. Simple async interface with dependency injection support.
$ dotnet add package ForeverTools.APILayerA unified .NET client for the APILayer marketplace APIs. Access IP geolocation, currency exchange rates, phone validation, email verification, and more with a single API key.
dotnet add package ForeverTools.APILayer
Get your API key at apilayer.com.
using ForeverTools.APILayer;
// Create client
var client = new ApiLayerClient("your-api-key");
// IP Geolocation
var geoResult = await client.GetIpGeolocationAsync("8.8.8.8");
if (geoResult.Success)
{
Console.WriteLine($"Country: {geoResult.Data.CountryName}");
Console.WriteLine($"City: {geoResult.Data.City}");
}
// Currency Exchange
var ratesResult = await client.GetExchangeRatesAsync("USD", new[] { "EUR", "GBP", "JPY" });
if (ratesResult.Success)
{
Console.WriteLine($"EUR: {ratesResult.Data.GetRate("EUR")}");
}
// Currency Conversion
var convertResult = await client.ConvertCurrencyAsync("USD", "EUR", 100);
if (convertResult.Success)
{
Console.WriteLine($"100 USD = {convertResult.Data.Result} EUR");
}
// Phone Validation
var phoneResult = await client.ValidatePhoneAsync("+14155552671");
if (phoneResult.Success && phoneResult.Data.Valid)
{
Console.WriteLine($"Carrier: {phoneResult.Data.Carrier}");
Console.WriteLine($"Type: {phoneResult.Data.LineType}");
}
// Email Validation
var emailResult = await client.ValidateEmailAsync("test@example.com");
if (emailResult.Success)
{
Console.WriteLine($"Valid format: {emailResult.Data.FormatValid}");
Console.WriteLine($"Deliverable: {emailResult.Data.IsDeliverable}");
Console.WriteLine($"Disposable: {emailResult.Data.Disposable}");
}
// In Program.cs or Startup.cs
services.AddForeverToolsApiLayer("your-api-key");
// Or from configuration
services.AddForeverToolsApiLayer(configuration);
appsettings.json:
{
"APILayer": {
"ApiKey": "your-api-key",
"TimeoutSeconds": 30
}
}
Inject and use:
public class MyService
{
private readonly ApiLayerClient _client;
public MyService(ApiLayerClient client)
{
_client = client;
}
public async Task<string> GetUserCountry(string ipAddress)
{
var result = await _client.GetIpGeolocationAsync(ipAddress);
return result.Success ? result.Data.CountryName : "Unknown";
}
}
// Look up any IP address
var result = await client.GetIpGeolocationAsync("8.8.8.8");
// Look up caller's IP
var myIp = await client.GetMyIpGeolocationAsync();
// Access detailed data
result.Data.CountryCode // "US"
result.Data.City // "Mountain View"
result.Data.Latitude // 37.386
result.Data.TimeZone.Id // "America/Los_Angeles"
result.Data.Currency.Code // "USD"
result.Data.Security.IsProxy // false
// Latest rates
var rates = await client.GetExchangeRatesAsync("USD");
// Historical rates
var historical = await client.GetHistoricalRatesAsync("2024-01-15", "USD");
// Convert currency
var conversion = await client.ConvertCurrencyAsync("USD", "EUR", 100);
// Time series (365 days max)
var series = await client.GetTimeSeriesAsync("2024-01-01", "2024-01-31", "USD");
// Rate fluctuation
var fluctuation = await client.GetFluctuationAsync("2024-01-01", "2024-01-31", "USD");
// Available symbols
var symbols = await client.GetCurrencySymbolsAsync();
var result = await client.ValidatePhoneAsync("+14155552671");
result.Data.Valid // true
result.Data.LocalFormat // "4155552671"
result.Data.InternationalFormat // "+14155552671"
result.Data.CountryCode // "US"
result.Data.Carrier // "AT&T Mobility LLC"
result.Data.LineType // "mobile"
var result = await client.ValidateEmailAsync("user@example.com");
result.Data.FormatValid // true
result.Data.MxFound // true
result.Data.SmtpCheck // true
result.Data.Disposable // false
result.Data.Free // false
result.Data.Role // false
result.Data.Score // 0.85
result.Data.IsDeliverable // true (computed)
result.Data.Quality // EmailQuality.High
All methods return ApiLayerResponse<T> which includes error information:
var result = await client.GetIpGeolocationAsync("invalid");
if (!result.Success)
{
Console.WriteLine($"Error: {result.Error.Message}");
Console.WriteLine($"Code: {result.Error.Code}");
}
// Uses APILAYER_KEY by default
var client = ApiLayerClient.FromEnvironment();
// Or specify a custom variable
var client = ApiLayerClient.FromEnvironment("MY_API_KEY");
MIT License - see LICENSE file for details.