Install
openclaw skills install @nts/signalhire-skillInteract with the SignalHire API to enrich and verify professional contacts. Use this skill when asked to find email addresses, phone numbers, or search for professional profiles and companies using SignalHire. Supports Person API for comprehensive profile/contact data and Search API for lead genera
openclaw skills install @nts/signalhire-skillThis skill provides context and instructions for using the SignalHire API to retrieve contact information (emails, phone numbers, social media profiles) from a global database of professionals.
To access the SignalHire API, an API key is required. The API key must be included in the apikey request header.
If the user hasn't provided their SignalHire API key in their request or environment, ask them to provide it before making API calls. Ensure it is kept secure and not exposed publicly.
Retrieves comprehensive profile and full contact details about a specific individual based on unique identifiers (e.g., LinkedIn® profile links, email addresses, phone numbers, or ID).
Searches for individuals or companies using various filters (e.g., job title, location, industry). Returns a brief overview of information without contact details.
The Person API is asynchronous: you submit a request with a callbackUrl, and SignalHire POSTs the enriched result to that URL when ready.
?k=<secret>), because SignalHire controls the outbound request and cannot set custom headers.You need an HTTP server that:
POST /signalhire/callback?k=<secret>k parameter against your stored secretsignalhire_result.json) so the agent can read it backA minimal Flask example:
import hmac, os
from flask import Flask, request, jsonify
import json
app = Flask(__name__)
SECRET = os.environ["SIGNALHIRE_WEBHOOK_SECRET"]
@app.before_request
def auth():
if request.method == "POST":
k = request.args.get("k", "")
if not hmac.compare_digest(k, SECRET):
return jsonify({"error": "unauthorized"}), 403
@app.route("/signalhire/callback", methods=["POST"])
def callback():
payload = request.get_json()
with open("signalhire_result.json", "w") as f:
json.dump(payload, f, indent=2)
return jsonify({"status": "accepted"}), 200
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8000)
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
Store this value as SIGNALHIRE_WEBHOOK_SECRET in your server's environment.
SIGNALHIRE_CALLBACK_URLConstruct the full callback URL including the secret:
https://<your-domain>/signalhire/callback?k=<your-secret>
Store it as the environment variable SIGNALHIRE_CALLBACK_URL, or in a config file your agent reads. Never hardcode it in source files — rotate the secret by updating it in one place.
Example (shell / .env file):
SIGNALHIRE_CALLBACK_URL=https://your-domain.com/signalhire/callback?k=your-secret-here
SIGNALHIRE_WEBHOOK_SECRET=your-secret-here
Read SIGNALHIRE_CALLBACK_URL from the environment at runtime and pass it as callbackUrl in every Person API request body. Do not hardcode the URL.
import os
callback_url = os.environ["SIGNALHIRE_CALLBACK_URL"]
After submitting the enrichment request, poll or wait for signalhire_result.json to be written by your webhook server, then read and return the data to the user.
The HTTP response headers provide the total remaining credits in the X-Credits-Left header. Always keep track of this if possible and alert the user if they are running low.
When the user asks you to search for a contact or company using SignalHire:
apikey.SIGNALHIRE_CALLBACK_URL from the environment; if unset, prompt the user to complete Callback Setup above before proceeding.exec tool to run a curl or fetch script passing the apikey header (-H "apikey: $API_KEY") and the callbackUrl in the request body.signalhire_result.json and return the findings to the user cleanly.