Tunnista.fi-rajapinta
Käynnistä asiakkaan tunnistus ja tuntemistietolomake omasta järjestelmästäsi ja saa tulos takaisin automaattisesti. Rajapinta kuuluu Pro- ja Plus-paketteihin. Avaimet luodaan kohdassa Asetukset → Rajapinta ja webhookit.
Näin se toimii
- Luo tunnistus valitulle lomakkeelle. Saat vastauksena asiakkaan henkilökohtaisen linkin.
- Ohjaa asiakas linkkiin omassa palvelussasi tai viestissäsi. Asiakas tunnistautuu ja täyttää lomakkeen.
- Saat tuloksen webhookilla heti, kun asiakas on valmis, tai kysymällä tilaa.
Avain ja pyyntöraja
Lähetä avain jokaisessa pyynnössä otsakkeessa Authorization: Bearer tf_live_…. Avain näytetään vain luonnin yhteydessä, joten tallenna se heti turvaan.
Pyyntöraja: Pro 60 / min, Plus 300 / min avainta kohden.
Luo tunnistus
POST /api/public/v1/verifications · oikeus verifications:write · lomakkeen pitää olla julkaistu.
curl -X POST https://tunnista.fi/api/public/v1/verifications \
-H "Authorization: Bearer $TUNNISTA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: crm-asiakas-1234" \
-d '{
"form_id": "LOMAKKEEN_ID",
"recipient": { "email": "asiakas@example.com", "name": "Matti Meikäläinen" },
"external_ref": "crm-asiakas-1234",
"expires_in_days": 30
}'| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
form_id | Kyllä | Julkaistun lomakkeen tunniste. Löytyy lomakkeen asetuksista. |
recipient.email | Kyllä | Asiakkaan sähköpostiosoite. Linkki on sidottu tähän asiakkaaseen. |
recipient.name | Ei | Asiakkaan nimi, enintään 120 merkkiä. |
external_ref | Ei | Oma tunnisteesi, esim. CRM-asiakasnumero. Voit hakea tunnistuksia sillä. |
expires_in_days | Ei | Linkin voimassaolo päivinä, 1–180. Oletus 30. |
Vastaus 201
{
"id": "6f1c…",
"object": "verification",
"status": "pending",
"form_id": "LOMAKKEEN_ID",
"external_ref": "crm-asiakas-1234",
"recipient": { "email": "asiakas@example.com", "name": "Matti Meikäläinen" },
"created_at": "2026-10-22T10:00:00Z",
"expires_at": "2026-11-21T10:00:00Z",
"completed_at": null,
"response": null,
"url": "https://tunnista.fi/f/lomake?invite=…"
}Tallenna id ja ohjaa asiakas osoitteeseen url. Linkki näytetään vain tässä vastauksessa.
Tuplien esto
Lähetä otsake Idempotency-Key. Kun sama avain tulee uudelleen, saat saman vastauksen eikä uutta tunnistusta luoda. Näin uudelleenyritys verkkovirheen jälkeen on turvallinen.
Tarkista tila
GET /api/public/v1/verifications/:id · oikeus verifications:read
| Tila | Merkitys |
|---|---|
pending | Luotu, asiakas ei ole vielä avannut linkkiä. |
opened | Asiakas on avannut linkin. |
identified | Asiakas on tunnistautunut vahvasti, lomake on vielä kesken. |
completed | Lomake on lähetetty tai allekirjoitettu. |
expired | Linkin voimassaolo päättyi ennen kuin lomake valmistui. |
cancelled | Tunnistus on peruttu. |
Vastauksen kentät
Lisää ?include=answers, niin saat lomakkeen vastaukset mukaan (oikeus responses:read). Arkaluonteisia kenttiä, kuten henkilötunnusta, ei palauteta.
Listaa tunnistukset
GET /api/public/v1/verifications?external_ref=…&limit=25 palauttaa rajapinnalla luodut tunnistukset uusimmasta alkaen. limit on 1–100, oletus 25.
Webhookit
Lisää osoite kohdassa Asetukset → Rajapinta ja webhookit. Saat ilmoituksen näistä tapahtumista:
verification.completed– tunnistus valmistuiresponse.submitted– lomake lähetettiinsignature.completed– allekirjoitus valmistuirisk_flag.created– vastauksesta löytyi tarkistettavaa
Vastaa 2xx-koodilla 10 sekunnin kuluessa. Muuten toimitusta yritetään uudelleen porrastetusti.
Tarkista jokaisen kutsun aitous otsakkeesta X-Tunnista-Signature: t=AIKALEIMA,v1=ALLEKIRJOITUS. Allekirjoitus on HMAC-SHA256 merkkijonosta AIKALEIMA.body.
import crypto from "node:crypto";
function verify(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}Virheet
Virheet palautetaan muodossa { "error": { "code", "message" } }.
| HTTP | code | Mitä tehdä |
|---|---|---|
| 400 | invalid_request | Tarkista pyynnön kentät, viesti kertoo mikä puuttuu. |
| 401 | unauthorized | Avain puuttuu tai on virheellinen. Luo tarvittaessa uusi. |
| 402 | subscription_required | Rajapinta vaatii voimassa olevan Pro- tai Plus-tilauksen. |
| 403 | forbidden | Avaimelta puuttuu tarvittava oikeus. Lisää se avaimen asetuksista. |
| 403 | workspace_closed | Työtila on suljettu. |
| 404 | form_not_found | Lomaketta ei löydy tästä työtilasta. |
| 404 | not_found | Tunnistusta ei löydy. |
| 409 | form_not_published | Julkaise lomake ennen tunnistuksen luomista. |
| 429 | rate_limited | Pyyntöraja ylittyi. Odota hetki ja yritä uudelleen. |
Tarvitsetko apua?
Vastaamme kysymyksiin rajapinnasta, avaimista ja webhookeista — myös toteutuksesi teknisissä yksityiskohdissa. Ota yhteyttä: hello@internerds.fi