Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
052081d
ipgeolocation_io: add app file and 12 actions
mateen993 Mar 6, 2026
320e362
Update components/ipgeolocation_io/actions/get-abuse-contact/get-abus…
mateen993 Mar 6, 2026
bf8c7e7
Update components/ipgeolocation_io/actions/get-asn/get-asn.mjs
mateen993 Mar 6, 2026
7d0d7aa
Update components/ipgeolocation_io/actions/get-bulk-geolocation/get-b…
mateen993 Mar 6, 2026
d582959
Update components/ipgeolocation_io/actions/get-ip-security/get-ip-sec…
mateen993 Mar 6, 2026
9eeddd9
Update components/ipgeolocation_io/actions/parse-bulk-user-agents/par…
mateen993 Mar 6, 2026
85365d4
Update components/ipgeolocation_io/ipgeolocation_io.app.mjs
mateen993 Mar 6, 2026
8766743
Update components/ipgeolocation_io/README.md
mateen993 Mar 6, 2026
74d49a8
Update components/ipgeolocation_io/README.md
mateen993 Mar 6, 2026
8193837
Update components/ipgeolocation_io/actions/parse-user-agent/parse-use…
mateen993 Mar 6, 2026
fa46560
ipgeolocation_io: fix files path
mateen993 Mar 6, 2026
3cbbb19
ipgeolocation_io: fix: import + add: validation (convert-timezone)
mateen993 Mar 6, 2026
cee55de
ipgeolocation_io: add - validation (astronomy-time-series)
mateen993 Mar 6, 2026
9161dd3
ipgeolocation_io: fix: apiKey input as props add
mateen993 Mar 6, 2026
7b6c981
Update components/ipgeolocation_io/package.json
mateen993 Mar 6, 2026
fd049ed
ipgeolocation_io: fix: auth + get-timezone
mateen993 Mar 6, 2026
8d99b72
ipgeolocation_io: fix summary
mateen993 Mar 6, 2026
29c8ec2
ipgeolocation_io: add $ context
mateen993 Mar 6, 2026
c51580b
Update components/ipgeolocation_io/actions/get-astronomy/get-astronom…
mateen993 Mar 6, 2026
0dca4f8
Update components/ipgeolocation_io/actions/get-astronomy-time-series/…
mateen993 Mar 6, 2026
be480a2
Merge remote-tracking branch 'upstream/master' into add/ipgeolocation…
michelle0927 Mar 6, 2026
43ed1e5
move ipgeolocation_io to ipgeolocation
michelle0927 Mar 6, 2026
4bb8505
move api call methods to app file
michelle0927 Mar 6, 2026
915da98
create common file for languages
michelle0927 Mar 6, 2026
e00020a
update props to camelCase
michelle0927 Mar 6, 2026
2183463
pnpm-lock.yaml
michelle0927 Mar 6, 2026
d7df96e
fix key
michelle0927 Mar 6, 2026
b87bc66
update api key
michelle0927 Mar 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions components/ipgeolocation_io/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Overview

[IPGeolocation.io](https://ipgeolocation.io) provides a suite of real-time IP intelligence APIs. With a single API key, you can look up geolocation data, security threats, ASN details, abuse contacts, timezone information, astronomy data, and user-agent details for any IPv4/IPv6 address, domain, or coordinates.

## Available APIs

- **IP Geolocation API** — Location, timezone, currency, ASN, and network data for any IP or domain
- **IP Security API** — Threat intelligence including VPN, proxy, Tor, bot, and spam detection
- **ASN API** — Detailed ASN information including peers, upstreams, routes, and WHOIS data
- **Abuse Contact API** — Abuse contact emails, phone numbers, and organization info for any IP
- **Timezone API** — Timezone lookup and conversion by IP, coordinates, city, IATA, ICAO, or UN/LOCODE
- **User Agent API** — Browser, device, OS, and engine details parsed from a user agent string
- **Astronomy API** — Sunrise, sunset, moon phase, and sun/moon position for any location or date range

## Limitations

- The free plan provides generous 1,000 lookups per day
- Bulk lookups, security data, abuse contacts, ASN details, and multi-language responses require a paid plan
- The Astronomy Time Series endpoint supports a maximum date range of 90 days
- The Bulk IP Geolocation and Bulk IP Security endpoints support a maximum of 50,000 IPs per request

# Example Use Cases

- **Fraud Detection Pipeline** — On every new user signup, use the **Get IP Security** action to check if the registration IP is a known VPN, proxy, or Tor exit node. If the threat score exceeds a threshold, flag the account in your database or trigger a Slack alert for manual review.

- **Geo-targeted Notifications** — Use **Get IP Geolocation** to detect a visitor's country and timezone from their IP address, then send personalized notifications or emails at the correct local time using Pipedream's scheduler.

- **Automated Abuse Reporting** — When your server logs detect suspicious traffic, use **Get Abuse Contact** to automatically retrieve the responsible organization's contact details and send a formatted abuse report via email.

- **Timezone-aware Scheduling** — Use **Get Timezone** or **Convert Timezone** to resolve and convert timezones for users across regions, then schedule reminders and workflow triggers at the right local time.

- **Photography & Outdoor Event Planning** — Use **Get Astronomy Time Series** to pull sunrise, sunset, golden hour, and moon phase data for a 30-day window for any location, and send a weekly digest to subscribers.

- **Network Inventory Enrichment** — Use **Get ASN Details** to enrich a list of IP addresses in a Google Sheet with ASN organization, routing, and WHOIS data in bulk.

# Getting Started

## Creating an Account

1. Sign up for a free account at [ipgeolocation.io](https://ipgeolocation.io)
2. Verify your email address to activate your account

## Generating an API Key

1. Log in to your [IPGeolocation.io dashboard](https://app.ipgeolocation.io)
2. Your API key is displayed on the dashboard home page
3. Copy the API key

## Connecting to Pipedream

1. In any IPGeolocation.io action on Pipedream, click **Connect Account**
2. Paste your API key when prompted
3. Click **Save** — your account is now connected and ready to use

# Troubleshooting

## 401 Unauthorized

This error means your API key is invalid, missing, or your account subscription has expired. Double-check your API key in the [IPGeolocation.io dashboard](https://app.ipgeolocation.io) and ensure your subscription is active.

## 400 Bad Request
This typically means an invalid IP address, malformed date format, or an unsupported parameter value was passed. Ensure:
- IP addresses are valid IPv4 or IPv6 format
- Dates are in `YYYY-MM-DD` format
- Date ranges do not exceed 90 days (for Astronomy Time Series)

## 403 Forbidden / Feature Not Available

Some actions (bulk lookups, IP security, abuse contact, ASN details, and multi-language responses) require a paid plan. Upgrade your subscription at [ipgeolocation.io/pricing](https://ipgeolocation.io/pricing.html) to access these features.

Moreover, if you're having trouble connecting to IPGeolocation.io, please [contact support](mailto:support@ipgeolocation.io).
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
import ipgeolocation_io from "../../ipgeolocation_io.app.mjs";

export default {
key: "ipgeolocation_io-convert-timezone",
name: "Convert Timezone",
description:
"Convert a time between two timezones using timezone names, coordinates, city, IATA, ICAO, or UN/LOCODE. [See the documentation](https://ipgeolocation.io/documentation/timezone-api.html)",
version: "0.0.1",
type: "action",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: true,
},
props: {
ipgeolocation_io,
tz_from: {
type: "string",
label: "From Timezone",
description: "Source timezone name (e.g. `America/New_York`). Must be used with `To Timezone`",
optional: true,
},
tz_to: {
type: "string",
label: "To Timezone",
description: "Target timezone name (e.g. `Asia/Tokyo`). Must be used with `From Timezone`",
optional: true,
},
lat_from: {
type: "string",
label: "From Latitude",
description: "Source latitude coordinate. Must be used with From Longitude",
optional: true,
},
long_from: {
type: "string",
label: "From Longitude",
description: "Source longitude coordinate. Must be used with From Latitude",
optional: true,
},
lat_to: {
type: "string",
label: "To Latitude",
description: "Target latitude coordinate. Must be used with To Longitude",
optional: true,
},
long_to: {
type: "string",
label: "To Longitude",
description: "Target longitude coordinate. Must be used with To Latitude",
optional: true,
},
location_from: {
type: "string",
label: "From Location",
description: "Source city or address (e.g. `New York, USA`). Must be used with To Location",
optional: true,
},
location_to: {
type: "string",
label: "To Location",
description: "Target city or address (e.g. `London, UK`). Must be used with From Location",
optional: true,
},
iata_from: {
type: "string",
label: "From IATA Code",
description: "Source airport IATA code (e.g. `JFK`). Must be used with To IATA Code",
optional: true,
},
iata_to: {
type: "string",
label: "To IATA Code",
description: "Target airport IATA code (e.g. `LHR`). Must be used with From IATA Code",
optional: true,
},
icao_from: {
type: "string",
label: "From ICAO Code",
description: "Source airport ICAO code (e.g. `KJFK`). Must be used with To ICAO Code",
optional: true,
},
icao_to: {
type: "string",
label: "To ICAO Code",
description: "Target airport ICAO code (e.g. `EGLL`). Must be used with From ICAO Code",
optional: true,
},
locode_from: {
type: "string",
label: "From UN/LOCODE",
description: "Source UN/LOCODE (e.g. `USNYC`). Must be used with To UN/LOCODE",
optional: true,
},
locode_to: {
type: "string",
label: "To UN/LOCODE",
description: "Target UN/LOCODE (e.g. `GBLON`). Must be used with From UN/LOCODE",
optional: true,
},
time: {
type: "string",
label: "Time to Convert",
description: "Time to convert in format `YYYY-MM-DD HH:mm` or `YYYY-MM-DD HH:mm:ss`. Leave blank to convert current time",
optional: true,
},
},
async run({ $ }) {
const hasValue = (value) => value !== undefined && value !== null && value !== "";
const hasPair = (from, to) => hasValue(from) && hasValue(to);
const hasAnyCoord = [
this.lat_from,
this.long_from,
this.lat_to,
this.long_to,
].some(hasValue);
const hasFullCoordSet = [
this.lat_from,
this.long_from,
this.lat_to,
this.long_to,
].every(hasValue);

if (
(hasValue(this.tz_from) !== hasValue(this.tz_to))
|| (hasValue(this.location_from) !== hasValue(this.location_to))
|| (hasValue(this.iata_from) !== hasValue(this.iata_to))
|| (hasValue(this.icao_from) !== hasValue(this.icao_to))
|| (hasValue(this.locode_from) !== hasValue(this.locode_to))
|| (hasAnyCoord && !hasFullCoordSet)
) {
throw new Error("Provide complete source and target values for the selected conversion mode.");
}

if (!(
hasPair(this.tz_from, this.tz_to)
|| hasPair(this.location_from, this.location_to)
|| hasPair(this.iata_from, this.iata_to)
|| hasPair(this.icao_from, this.icao_to)
|| hasPair(this.locode_from, this.locode_to)
|| hasFullCoordSet
)) {
throw new Error("Provide a valid source and target using timezone names, coordinates, locations, IATA, ICAO, or UN/LOCODE.");
}

const response = await this.ipgeolocation_io._makeRequest({
path: "/timezone/convert",
params: {
tz_from: this.tz_from,
tz_to: this.tz_to,
time: this.time,
lat_from: this.lat_from,
long_from: this.long_from,
lat_to: this.lat_to,
long_to: this.long_to,
location_from: this.location_from,
location_to: this.location_to,
iata_from: this.iata_from,
iata_to: this.iata_to,
icao_from: this.icao_from,
icao_to: this.icao_to,
locode_from: this.locode_from,
locode_to: this.locode_to,
},
});

const from = this.tz_from || `${this.lat_from},${this.long_from}` || this.location_from || this.iata_from
|| this.icao_from || this.locode_from ;
const to = this.tz_to || `${this.lat_to},${this.long_to}` || this.location_to || this.iata_to
|| this.icao_to || this.locode_to;

$.export("$summary", `Successfully converted time from ${from} to ${to}`);
return response;
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import ipgeolocation_io from "../../ipgeolocation_io.app.mjs";

export default {
key: "ipgeolocation_io-get-abuse-contact",
name: "Get Abuse Contact",
description:
"Retrieve abuse contact information for an IPv4 or IPv6 address, including abuse emails, phone numbers, organization, and network route. Only available on paid plans. [See the documentation](https://ipgeolocation.io/documentation/ip-abuse-contact-api.html)",
version: "0.0.1",
type: "action",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: true,
},
props: {
ipgeolocation_io,
ip: {
type: "string",
label: "IP Address",
description: "The IPv4 or IPv6 address to retrieve abuse contact information for. Leave blank to retrieve abuse contact information for the caller's IP address",
optional: true,
},
fields: {
type: "string",
label: "Fields",
description: "Comma-separated list of fields to return (e.g. `abuse.emails,abuse.organization`). Reduces response size",
optional: true,
},
excludes: {
type: "string",
label: "Exclude Fields",
description: "Comma-separated list of fields to exclude from the response. The `ip` field is always returned",
optional: true,
},
},
async run({ $ }) {
const response = await this.ipgeolocation_io._makeRequest({
path: "/abuse",
params: {
ip: this.ip,
fields: this.fields,
excludes: this.excludes,
},
});
$.export("$summary", `Successfully retrieved abuse contact for ${this.ip || `caller's IP: ${response.ip}`}`);
return response;
},
};
62 changes: 62 additions & 0 deletions components/ipgeolocation_io/actions/get-asn/get-asn.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import ipgeolocation_io from "../../ipgeolocation_io.app.mjs";

export default {
key: "ipgeolocation_io-get-asn",
name: "Get ASN Details",
description:
"Retrieve detailed ASN information including peers, upstreams, downstreams, routes, and WHOIS data for an ASN number or IP address. Only available on paid plans. [See the documentation](https://ipgeolocation.io/documentation/asn-api.html)",
version: "0.0.1",
type: "action",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: true,
},
props: {
ipgeolocation_io,
ip: {
type: "string",
label: "IP Address",
description: "The IPv4/IPv6 address to look up. Leave blank to lookup ASN data for the caller's IP address",
optional: true,
},
asn: {
type: "string",
label: "ASN",
description: "The ASN number (e.g. `AS15169`). If both `ip` and `asn` are provided, `asn` will be used",
optional: true,
},
include: {
type: "string",
label: "Include Additional Data",
description: "Comma-separated list of extra modules to include in the response. Available values: `routes`, `peers`, `upstreams`, `downstreams`, `whois_response`. Use `*` to include all.",
optional: true,
},
fields: {
type: "string",
label: "Fields",
description: "Comma-separated list of fields to return (e.g. `asn.organization,asn.routes`). Reduces response size",
optional: true,
},
excludes: {
type: "string",
label: "Exclude Fields",
description: "Comma-separated list of fields to exclude from the response. The `ip` field is always returned if querying by IP address",
optional: true,
},
},
async run({ $ }) {
const response = await this.ipgeolocation_io._makeRequest({
path: "/asn",
params: {
asn: this.asn,
ip: this.ip,
include: this.include,
fields: this.fields,
excludes: this.excludes,
},
});
$.export("$summary", `Successfully retrieved ASN details for ${this.asn || this.ip || `caller's IP: ${response.ip}`}`);
return response;
},
};
Loading