Agent skill
fonecta-lookup
Reverse-lookup Finnish phone numbers via Fonecta Caller (fonecta.fi). Use when given a list of Finnish mobile or landline numbers and asked to find the associated person or company names. Requires a Fonecta account with CallerPro subscription and Playwright installed.
Install this agent skill to your Project
npx add-skill https://github.com/akaihola/skills-akaihola/tree/main/fonecta-lookup
SKILL.md
Purpose
Look up Finnish phone numbers on Fonecta Caller and return a phone → name map. Fonecta is the primary Finnish directory service; it covers most publicly listed personal and business numbers.
The script uses Playwright to log in, navigate to each number's search page, and extract results from the __NEXT_DATA__ JSON blob embedded in the SSR-rendered HTML. No undocumented API calls are needed beyond what the browser does naturally.
When to Use
Use this skill when you have a list of Finnish phone numbers (starting with +358 or 0) and need to resolve them to names — for example to enrich a WhatsApp participant list, a call log, or any dataset that contains bare phone numbers.
Do not use for non-Finnish numbers; Fonecta only covers Finland.
Prerequisites
Workflow
1. Prepare the phone list
Normalise all numbers to bare E.164 digits without a leading + (e.g. 358401234567). The script accepts any format — +358…, 0…, 358… — and normalises internally, but a clean list avoids surprises.
Write the numbers to a file, one per line, or pass them directly with --phones.
2. Run the lookup
FONECTA_EMAIL=user@example.com FONECTA_PASSWORD=secret \
uv run scripts/fonecta_lookup.py \
--phones-file phones.txt \
--output fonecta-names.yaml
Or with inline numbers:
FONECTA_EMAIL=... FONECTA_PASSWORD=secret \
uv run scripts/fonecta_lookup.py \
--phones 358401234567 358407654321 \
--output fonecta-names.yaml
The script is incremental: if --output already exists, previously resolved numbers are skipped. Reruns after a partial failure only look up the remainder.
3. Read the results
fonecta-names.yaml contains a mapping of normalised E.164 digits → name string (or null if not found):
358401234567: Matti Meikäläinen
358407654321: Yritys Oy
358409999999: null # not found in Fonecta
Pass this file to whatever downstream process needs the names.
How Results Are Extracted
The search page https://www.fonecta.fi/haku/<local-number> is a Next.js SSR page. The search results are embedded in the page HTML as a __NEXT_DATA__ JSON blob populated by React Query (dehydratedState). The script parses this directly — no additional API call is needed.
The relevant path inside __NEXT_DATA__:
props.pageProps.dehydratedState.queries[]
→ queryKey[0] == "search"
→ state.data.results[0].displayName
See references/fonecta-api.md for full API details, the authentication flow, and notes on rate limiting.
Login Flow Detail
The login form is a two-step MUI Dialog:
- Accept the OneTrust cookie consent banner.
- Click the "Kirjaudu sisään" nav button (opens the dialog).
- Enter email → click "Seuraava".
- Enter password → click the "Kirjaudu sisään" button scoped to the dialog (the nav-bar button is visually blocked by the dialog overlay and times out if clicked directly).
Known Limitations
- Numbers that are unlisted, prepaid SIMs, or business lines not registered with Fonecta return
null. Approximately 25 % of Finnish mobile numbers are not in the directory. - The
fofisuggestautocomplete endpoint consistently returns empty results even for numbers that the full search page resolves; ignore it. - The script runs headless. If Fonecta introduces bot-detection measures, switching to
headless=Falsemay help. - Session tokens expire after ~30 minutes. For batches longer than ~200 numbers, add token refresh logic (see references/fonecta-api.md).
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
youtube-to-markdown
Convert a YouTube video into clean, readable Markdown using its free auto-generated captions (no paid API needed). Use when the user asks to "convert YouTube video to markdown", "get transcript from YouTube URL", "summarise this video", or wants to turn YouTube subtitles/captions into readable text. Prefer this over youtube-transcription when the video already has auto-generated subtitles — it's free and faster. Accepts YouTube URLs.
brave-search
Search the web using Brave Search API. Use when the user asks to "search the web", "look up current information", "find news about", "research a topic online", "check prices online", or needs up-to-date facts that may not be in the model's training data. Requires BRAVE_SEARCH_API_KEY. Supports structured web results (pages, FAQs, news, videos) and an optional AI summarizer.
verkkokauppa
Search products on the Verkkokauppa.com Finnish webshop. This skill uses the Verkkokauppa search API directly, requiring no browser. Use when the user asks to "search Verkkokauppa", "find products on verkkokauppa.com", "verkkokauppa product search", "check Verkkokauppa prices", or mentions searching the Verkkokauppa store.
clasohlson
Search products on the Clas Ohlson Finland webshop (clasohlson.com/fi/). This skill uses the Voyado Elevate (Apptus eSales) search API directly, requiring no browser. Use when the user asks to "search Clas Ohlson", "find products on clasohlson.com", "clas ohlson product search", "check Clas Ohlson prices", or mentions searching the Finnish Clas Ohlson store.
bauhaus
Search products on the Bauhaus webshop (bauhaus.fi). This skill uses the Algolia search API with automatic key refresh. Use when the user asks to "search Bauhaus", "find products on bauhaus.fi", "bauhaus product search", "check Bauhaus prices", or mentions searching the Bauhaus store.
library
Didn't find tool you were looking for?