{"openapi":"3.0.3","info":{"title":"eSinetti API","version":"1.0.0","description":"REST-API allekirjoituskierrosten hallintaan. Autentikointi: Authorization: Bearer sk_live_… Kaikki vastaukset JSON, virheet muodossa { error: { code, message } }.\n\nPyyntöraja: 60 pyyntöä minuutissa API-avainta kohden. Ylityksestä vastaus 429 ja Retry-After-otsake (sekunteja ikkunan nollautumiseen); odota se ja toista sama pyyntö.\n\nWebhookit: kun tenantille on asetettu webhook_url (Asetukset-sivulla), tapahtumat round.sent, signer.opened, signer.identified, signer.signed, signer.declined, round.completed, round.cancelled ja round.expired lähetetään POST-pyyntönä osoitteeseen HTTP-otsikolla X-eSinetti-Signature: t=<unix>,v1=<hmac_sha256(webhook_secret, t + \".\" + body)>. Uudelleenyritys epäonnistuneelle toimitukselle: 1min, 5min, 30min, 2h, 12h, 24h, sitten merkitään pysyvästi epäonnistuneeksi. Avaimella voi olla oma webhook_url ja webhook_secret (API-avaimet-sivulla): silloin sillä avaimella luodun kierroksen tapahtumat lähetetään avaimen osoitteeseen avaimen salaisuudella allekirjoitettuna, muuten organisaation osoitteeseen. Erillisen tunnistuksen tapahtumat identification.completed ja identification.failed lähetetään vain sen avaimen omaan webhook-osoitteeseen, jolla tunnistuspyyntö luotiin (ei organisaation yhteiseen osoitteeseen); ilman sitä tulos haetaan GET /identifications/{id} -kutsulla. Payload ei koskaan sisällä henkilötunnusta eikä syntymäaikaa."},"servers":[{"url":"/api/v1"}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"sk_live_…"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}},"Round":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string","enum":["draft","sent","partially_signed","completed","cancelled","expired"]},"sequential":{"type":"boolean"},"company_id":{"type":"string","format":"uuid","nullable":true},"company_name":{"type":"string","nullable":true},"external_ref":{"type":"string","nullable":true},"expires_at":{"type":"string","format":"date-time","nullable":true},"completed_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"},"documents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"position":{"type":"integer"},"page_count":{"type":"integer"},"size_bytes":{"type":"integer"},"original_sha256":{"type":"string"},"sealed_sha256":{"type":"string","nullable":true}}}},"signers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"role_label":{"type":"string","nullable":true},"auth_level":{"type":"string","enum":["strong","light"]},"position":{"type":"integer"},"status":{"type":"string","enum":["pending","opened","identified","signed","declined"]},"opened_at":{"type":"string","format":"date-time","nullable":true},"identified_at":{"type":"string","format":"date-time","nullable":true},"signed_at":{"type":"string","format":"date-time","nullable":true},"declined_at":{"type":"string","format":"date-time","nullable":true}}}}}},"Document":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"position":{"type":"integer"},"page_count":{"type":"integer"},"size_bytes":{"type":"integer"},"original_sha256":{"type":"string"},"sealed_sha256":{"type":"string","nullable":true}}},"Signer":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"role_label":{"type":"string","nullable":true},"auth_level":{"type":"string","enum":["strong","light"]},"position":{"type":"integer"},"status":{"type":"string","enum":["pending","opened","identified","signed","declined"]},"opened_at":{"type":"string","format":"date-time","nullable":true},"identified_at":{"type":"string","format":"date-time","nullable":true},"signed_at":{"type":"string","format":"date-time","nullable":true},"declined_at":{"type":"string","format":"date-time","nullable":true}}},"StandingSigner":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"role_label":{"type":"string","nullable":true}}},"Identification":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","started","completed","failed","cancelled","expired"],"description":"pending = linkkiä ei ole vielä avattu tunnistukseen, started = tunnistus on kesken, completed = onnistui, failed = epäonnistui, cancelled = käyttäjä perui, expired = linkki vanheni."},"external_ref":{"type":"string","nullable":true},"created_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time","nullable":true},"result":{"type":"object","nullable":true,"description":"Vain onnistuneella tunnistuksella. Sisältää vain nimen, tunnistustavan, ajan ja tapahtumatunnuksen: henkilötunnusta ja syntymäaikaa ei palauteta.","properties":{"name":{"type":"string"},"auth_method":{"type":"string","nullable":true,"description":"Esim. op, nordea, mobiilivarmenne."},"provider_transaction_id":{"type":"string","nullable":true},"identified_at":{"type":"string","format":"date-time","nullable":true}}}}}}},"security":[{"ApiKeyAuth":[]}],"paths":{"/rounds":{"post":{"summary":"Luo uuden allekirjoituskierroksen","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","documents","signers"],"properties":{"company_id":{"type":"string","format":"uuid"},"title":{"type":"string"},"sequential":{"type":"boolean","default":false},"expires_in_days":{"type":"integer","minimum":1,"maximum":365},"external_ref":{"type":"string"},"documents":{"type":"array","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"content_base64":{"type":"string","description":"Anna joko tämä tai upload_id, ei molempia."},"upload_id":{"type":"string","format":"uuid"}}},"minItems":1,"maxItems":20},"signers":{"type":"array","items":{"oneOf":[{"type":"object","required":["name","email"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"role_label":{"type":"string"},"expected_birthdate":{"type":"string","format":"date","description":"YYYY-MM-DD"},"expected_hetu":{"type":"string","description":"Valinnainen ennakkotarkistus. HMAC lasketaan heti eikä selväkielistä arvoa koskaan tallenneta tai lokiteta."},"auth_level":{"type":"string","enum":["strong","light"],"default":"strong","description":"'strong' = vahva sähköinen tunnistaminen (pankkitunnukset/mobiilivarmenne, FTN). 'light' = kevyt allekirjoitus sähköpostivahvistuksella (kertakäyttöinen koodi allekirjoittajan sähköpostiin, ei hetua/pankkitunnistusta)."}}},{"type":"object","required":["standing_signer_id"],"additionalProperties":false,"properties":{"standing_signer_id":{"type":"string","format":"uuid","description":"Organisaation asetuksiin tallennettu vakioallekirjoittaja (GET /standing-signers). eSinetti täyttää nimen, sähköpostin, auth_level = strong ja henkilötunnuksen tiivisteen, joten saman henkilön kaikki avoimet kierrokset allekirjoitetaan yhdellä tunnistuksella ilman, että kutsuja käsittelee henkilötunnusta. name, email, phone, expected_birthdate ja expected_hetu eivät ole sallittuja tämän kanssa (400). Tunniste, jota tällä organisaatiolla ei ole, hylätään koodilla 422."},"role_label":{"type":"string","description":"Ohittaa tallennetun roolitekstin tällä kierroksella."}}}]},"minItems":1,"maxItems":20},"send":{"type":"boolean","default":false},"requested_by":{"type":"object","description":"Kuka pyytää allekirjoitusta. Näkyy viesteissä muodossa \"Nimi (Organisaatio) kutsui sinut allekirjoittamaan\". Organisaation oletus on tilin lähettäjänimi.","properties":{"name":{"type":"string","maxLength":200},"organization":{"type":"string","maxLength":200}}}}}}}},"responses":{"201":{"description":"Kierros luotu","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string","enum":["draft","sent","partially_signed","completed","cancelled","expired"]},"sequential":{"type":"boolean"},"company_id":{"type":"string","format":"uuid","nullable":true},"company_name":{"type":"string","nullable":true},"external_ref":{"type":"string","nullable":true},"expires_at":{"type":"string","format":"date-time","nullable":true},"completed_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"},"documents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"position":{"type":"integer"},"page_count":{"type":"integer"},"size_bytes":{"type":"integer"},"original_sha256":{"type":"string"},"sealed_sha256":{"type":"string","nullable":true}}}},"signers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"role_label":{"type":"string","nullable":true},"auth_level":{"type":"string","enum":["strong","light"]},"position":{"type":"integer"},"status":{"type":"string","enum":["pending","opened","identified","signed","declined"]},"opened_at":{"type":"string","format":"date-time","nullable":true},"identified_at":{"type":"string","format":"date-time","nullable":true},"signed_at":{"type":"string","format":"date-time","nullable":true},"declined_at":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"400":{"description":"Validointivirhe","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"401":{"description":"Virheellinen API-avain","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"422":{"description":"standing_signer_id ei viittaa tämän organisaation vakioallekirjoittajaan","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}},"get":{"summary":"Listaa kierrokset","parameters":[{"name":"status","in":"query","schema":{"type":"string"}},{"name":"external_ref","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista kierroksia","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string","enum":["draft","sent","partially_signed","completed","cancelled","expired"]},"sequential":{"type":"boolean"},"company_id":{"type":"string","format":"uuid","nullable":true},"company_name":{"type":"string","nullable":true},"external_ref":{"type":"string","nullable":true},"expires_at":{"type":"string","format":"date-time","nullable":true},"completed_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"},"documents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"position":{"type":"integer"},"page_count":{"type":"integer"},"size_bytes":{"type":"integer"},"original_sha256":{"type":"string"},"sealed_sha256":{"type":"string","nullable":true}}}},"signers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"role_label":{"type":"string","nullable":true},"auth_level":{"type":"string","enum":["strong","light"]},"position":{"type":"integer"},"status":{"type":"string","enum":["pending","opened","identified","signed","declined"]},"opened_at":{"type":"string","format":"date-time","nullable":true},"identified_at":{"type":"string","format":"date-time","nullable":true},"signed_at":{"type":"string","format":"date-time","nullable":true},"declined_at":{"type":"string","format":"date-time","nullable":true}}}}}}}}}}}}}}},"/rounds/{id}":{"get":{"summary":"Hakee kierroksen tilan, asiakirjat ja allekirjoittajat","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Kierros","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string","enum":["draft","sent","partially_signed","completed","cancelled","expired"]},"sequential":{"type":"boolean"},"company_id":{"type":"string","format":"uuid","nullable":true},"company_name":{"type":"string","nullable":true},"external_ref":{"type":"string","nullable":true},"expires_at":{"type":"string","format":"date-time","nullable":true},"completed_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"},"documents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"position":{"type":"integer"},"page_count":{"type":"integer"},"size_bytes":{"type":"integer"},"original_sha256":{"type":"string"},"sealed_sha256":{"type":"string","nullable":true}}}},"signers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"role_label":{"type":"string","nullable":true},"auth_level":{"type":"string","enum":["strong","light"]},"position":{"type":"integer"},"status":{"type":"string","enum":["pending","opened","identified","signed","declined"]},"opened_at":{"type":"string","format":"date-time","nullable":true},"identified_at":{"type":"string","format":"date-time","nullable":true},"signed_at":{"type":"string","format":"date-time","nullable":true},"declined_at":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"404":{"description":"Ei löytynyt","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/rounds/{id}/send":{"post":{"summary":"Lähettää luonnostilassa olevan kierroksen (ensimmäiset kutsut)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Lähetetty","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string","enum":["draft","sent","partially_signed","completed","cancelled","expired"]},"sequential":{"type":"boolean"},"company_id":{"type":"string","format":"uuid","nullable":true},"company_name":{"type":"string","nullable":true},"external_ref":{"type":"string","nullable":true},"expires_at":{"type":"string","format":"date-time","nullable":true},"completed_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"},"documents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"position":{"type":"integer"},"page_count":{"type":"integer"},"size_bytes":{"type":"integer"},"original_sha256":{"type":"string"},"sealed_sha256":{"type":"string","nullable":true}}}},"signers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"role_label":{"type":"string","nullable":true},"auth_level":{"type":"string","enum":["strong","light"]},"position":{"type":"integer"},"status":{"type":"string","enum":["pending","opened","identified","signed","declined"]},"opened_at":{"type":"string","format":"date-time","nullable":true},"identified_at":{"type":"string","format":"date-time","nullable":true},"signed_at":{"type":"string","format":"date-time","nullable":true},"declined_at":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"409":{"description":"Kierros ei ole luonnostilassa","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/rounds/{id}/cancel":{"post":{"summary":"Peruuttaa kierroksen","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Peruutettu","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string","enum":["draft","sent","partially_signed","completed","cancelled","expired"]},"sequential":{"type":"boolean"},"company_id":{"type":"string","format":"uuid","nullable":true},"company_name":{"type":"string","nullable":true},"external_ref":{"type":"string","nullable":true},"expires_at":{"type":"string","format":"date-time","nullable":true},"completed_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"},"documents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"position":{"type":"integer"},"page_count":{"type":"integer"},"size_bytes":{"type":"integer"},"original_sha256":{"type":"string"},"sealed_sha256":{"type":"string","nullable":true}}}},"signers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"role_label":{"type":"string","nullable":true},"auth_level":{"type":"string","enum":["strong","light"]},"position":{"type":"integer"},"status":{"type":"string","enum":["pending","opened","identified","signed","declined"]},"opened_at":{"type":"string","format":"date-time","nullable":true},"identified_at":{"type":"string","format":"date-time","nullable":true},"signed_at":{"type":"string","format":"date-time","nullable":true},"declined_at":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"409":{"description":"Kierrosta ei voi enää peruuttaa","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/rounds/{id}/remind":{"post":{"summary":"Lähettää muistutuksen vielä allekirjoittamattomille","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Muistutukset lähetetty","content":{"application/json":{"schema":{"type":"object","properties":{"reminders_sent":{"type":"integer"}}}}}},"429":{"description":"Kierrokselle lähetettiin muistutus alle kaksi minuuttia sitten, eikä uutta lähetetä. Retry-After kertoo odotusajan sekunteina. Mitään ei lähetetty; toista pyyntö odotuksen jälkeen.","headers":{"Retry-After":{"description":"Sekunteja, kunnes muistutuksen saa lähettää uudelleen","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/rounds/{id}/signers/{signerId}/signing-link":{"post":{"summary":"Antaa allekirjoittajalle lyhytikäisen upotuslinkin","description":"Sovelluksesi kirjautunut käyttäjä, joka on myös kierroksen allekirjoittaja, voi allekirjoittaa heti ilman sähköpostia. Avaa palautettu url ponnahdusikkunaan (window.open, ei iframe: pankkitunnistus ei toimi iframessa). Kun allekirjoitus on valmis, ikkuna lähettää avaajalle postMessage-viestin { type: 'esinetti:completed', roundId } vain, jos sivusi origin on eSinetin asetuksissa kohdassa Sallitut domainit (upotus). Tarkista viestin origin omalla puolellasi.\n\nLinkki on voimassa 30 minuuttia ja vain tälle allekirjoittajalle. Uusi kutsu antaa uuden linkin ja mitätöi edellisen upotuslinkin; sähköpostilla lähetetty linkki pysyy voimassa. Linkki on avain allekirjoittajan paikalle: älä tallenna sitä, lokita sitä tai anna sitä muulle kuin allekirjoittajalle itselleen. Enintään 10 linkkiä 10 minuutissa allekirjoittajaa kohden.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"signerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Upotuslinkki","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","required":["url","expires_at"],"properties":{"url":{"type":"string","format":"uri","description":"Allekirjoitussivu muodossa https://<eSinetti>/sign/<token>?embed=1"},"expires_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"description":"Virheellinen API-avain","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"404":{"description":"Kierrosta tai allekirjoittajaa ei löytynyt (tai se kuuluu toiselle organisaatiolle)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"409":{"description":"Allekirjoittaja on jo allekirjoittanut tai kieltäytynyt, kierros ei ole avoinna, tai peräkkäisessä kierroksessa allekirjoittajan vuoro ei ole vielä tullut","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"429":{"description":"Liikaa pyyntöjä. API-avaimen rajan (60 / min) ylittyessä Retry-After kertoo odotusajan sekunteina.","headers":{"Retry-After":{"description":"Sekunteja ikkunan nollautumiseen","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/rounds/{id}/documents/{docId}/download":{"get":{"summary":"Ohjaa lyhytikäiseen (max 24h) latauslinkkiin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"docId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"original","in":"query","schema":{"type":"boolean"},"description":"true = alkuperäinen PDF, muuten sinetöity (vaatii completed-kierroksen)"}],"responses":{"302":{"description":"Ohjaus signed URL:iin"},"404":{"description":"Ei löytynyt","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"409":{"description":"Sinetöityä versiota ei vielä ole","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/standing-signers":{"get":{"summary":"Listaa organisaation vakioallekirjoittajat","description":"Integraatio tarkistaa tällä standing_signer_id:nsä. Vakioallekirjoittajat luodaan ja niitä muokataan vain eSinetin Asetukset-sivulla, koska henkilötunnus annetaan siellä. Vastaus ei sisällä henkilötunnusta, sen tiivistettä eikä sähköpostia.","responses":{"200":{"description":"Lista vakioallekirjoittajista","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"role_label":{"type":"string","nullable":true}}}}}}}}},"401":{"description":"Virheellinen API-avain","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/companies":{"post":{"summary":"Luo tai päivittää yhtiön (upsert business_id:llä)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"business_id":{"type":"string"},"external_ref":{"type":"string"}}}}}},"responses":{"201":{"description":"Yhtiö luotu/päivitetty"}}},"get":{"summary":"Listaa tenantin yhtiöt","responses":{"200":{"description":"Lista yhtiöitä"}}}},"/companies/lookup":{"get":{"summary":"Hakee yhtiön perustiedot PRH:n avoimesta YTJ-rajapinnasta","description":"Esitäyttöä varten: nimi, yhtiömuoto (`company_form`, tuntematon muoto → `muu`), osoite, rekisteröintipäivä ja kaupparekisterin tila. Ei tallenna mitään. Y-tunnuksen tarkistenumero tarkistetaan. Kotipaikka ja henkilöt eivät sisälly avoimeen dataan. Lähde: PRH ja Verohallinto, YTJ-avoin data (CC BY 4.0).","parameters":[{"name":"business_id","in":"query","required":true,"schema":{"type":"string","example":"0112038-9"}}],"responses":{"200":{"description":"Yhtiön tiedot","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"businessId":{"type":"string"},"name":{"type":"string","nullable":true},"companyForm":{"type":"string","nullable":true},"companyFormLabel":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"postalCode":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"registrationDate":{"type":"string","format":"date","nullable":true},"tradeRegisterStatus":{"type":"string","nullable":true},"warnings":{"type":"array","items":{"type":"string"}}}},"source":{"type":"string"}}}}}},"400":{"description":"Virheellinen Y-tunnus","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"404":{"description":"Y-tunnusta ei löytynyt PRH:sta","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"503":{"description":"PRH:n rajapinta ei vastannut","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/companies/{id}/persons":{"post":{"summary":"Synkronoi yhtiön henkilöt (hallitus, toimitusjohtaja, tilintarkastaja)","description":"Oletus `mode: upsert` päivittää täsmäävät ja lisää uudet mutta EI POISTA ketään — keskeytynyt vienti ei saa tyhjentää hallitusta. `replace` poistaa ne, joita listassa ei ole.\n\nTäsmäys tehdään nimellä (kirjainkoko, diakriitit ja sanajärjestys normalisoidaan). Rooli ei ole osa täsmäystä, joten roolin muutos päivittyy oikein.\n\n`expected_hetu` otetaan vastaan selväkielisenä, muunnetaan HMAC:ksi heti ja hävitetään. **Jos kenttää ei anneta, olemassa oleva tiiviste säilyy** — sitä ei voi laskea uudelleen, koska selväkielistä henkilötunnusta ei tallenneta.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["persons"],"properties":{"mode":{"type":"string","enum":["upsert","replace"],"default":"upsert"},"persons":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"object","required":["name","role"],"properties":{"name":{"type":"string","maxLength":200},"email":{"type":"string","format":"email"},"phone":{"type":"string","maxLength":64},"role":{"type":"string","enum":["hallituksen_pj","hallituksen_jasen","varajasen","toimitusjohtaja","tilintarkastaja","toiminnantarkastaja","sihteeri","muu"]},"expected_birthdate":{"type":"string","format":"date"},"expected_hetu":{"type":"string","description":"Selväkielinen henkilötunnus. Ei tallenneta eikä logiteta."},"valid_from":{"type":"string","format":"date"},"valid_to":{"type":"string","format":"date"},"position":{"type":"integer","minimum":0}}}}}}}}},"responses":{"200":{"description":"Synkronoitu. Vastaus kertoo muutosten määrät ja henkilöt ilman tiivisteitä; `has_expected_identity` kertoo onko ennakkotarkistus voimassa."},"404":{"description":"Yhtiötä ei löytynyt"}}},"get":{"summary":"Listaa yhtiön henkilöt","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Lista henkilöitä"}}}},"/companies/{id}/fiscal-years":{"post":{"summary":"Luo tai päivittää tilikauden (upsert end_date:lla)","description":"`figures` YHDISTETÄÄN olemassa oleviin lukuihin, ei korvata: lähetä vain ne luvut jotka tiedät, niin käyttöliittymässä täydennetyt eivät katoa. Tyhjä merkkijono tai `null` poistaa avaimen tietoisesti; nolla on merkitsevä luku eikä poista mitään.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["start_date","end_date"],"properties":{"start_date":{"type":"string","format":"date"},"end_date":{"type":"string","format":"date"},"status":{"type":"string","enum":["open","closing","signed","filed"]},"figures":{"type":"object","additionalProperties":true,"description":"Vapaa avainjoukko, esim. result_eur, balance_total_eur, dividend_eur."}}}}}},"responses":{"200":{"description":"Tilikausi päivitetty"},"201":{"description":"Tilikausi luotu"},"404":{"description":"Yhtiötä ei löytynyt"}}},"get":{"summary":"Listaa yhtiön tilikaudet","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Lista tilikausia"}}}},"/fiscal-years/{id}/generate":{"post":{"summary":"Luo tilikauden asiakirjat ja allekirjoituskierroksen","description":"Pöytäkirjat ja tilinpäätöksen allekirjoitussivu syntyvät yhtiön tallennetuista tiedoista (hallitus, tilikausi, luvut) ja lähtevät hallitukselle allekirjoitettavaksi. Ilman `template_keys`-kenttää käytetään yhtiömuodon oletuspohjia. Vain JULKAISTUT pohjat kelpaavat. Allekirjoittajat ovat kokouspäivänä toimessa olleet hallituksen jäsenet, joilla on sähköposti; ilman sähköpostia jääneet palautetaan `signers_missing_email`-kentässä. Henkilötunnusta ei oteta vastaan: ennakkotarkistus tulee yhtiön henkilöiden tallennetuista tiivisteistä.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"template_keys":{"type":"array","maxItems":10,"items":{"type":"string"},"description":"Esim. hallituksen_kokous_tilinpaatos, tilinpaatoksen_allekirjoitussivu, varsinainen_yhtiokokous."},"data":{"type":"object","additionalProperties":true,"description":"Pohjien kenttien arvot litteänä objektina (esim. meeting_date, meeting_place). Validoidaan valittujen pohjien yhdistettyä kenttämäärittelyä vasten."},"send":{"type":"boolean","default":false,"description":"Lähetetäänkö allekirjoituskutsut heti."}}}}}},"responses":{"201":{"description":"Asiakirjat ja kierros luotu"},"400":{"description":"Kenttävirheitä (`error.fields`) tai pohja ei sovi yhtiömuodolle"},"404":{"description":"Tilikautta tai pohjaa ei löytynyt"},"503":{"description":"Renderöintipalvelu ei vastaa — yritä uudelleen"}}}},"/documents/render":{"post":{"summary":"Renderöi asiakirja pohjasta PDF:ksi (ei tallenna mitään)","description":"Tilaton: pohja + arvot → PDF. Mitään ei tallenneta. Kuvat annetaan base64:na, koska renderöijä ei hae ulkoisia resursseja. Anna `today`, jos haluat että sama syöte tuottaa aina saman PDF:n.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["template_id","entity_name"],"properties":{"template_id":{"type":"string","format":"uuid"},"entity_name":{"type":"string","maxLength":200},"entity_identifier":{"type":"string","maxLength":50},"entity_domicile":{"type":"string","maxLength":100},"data":{"type":"object","additionalProperties":true},"items":{"type":"array","items":{"type":"object","required":["heading","text"],"properties":{"heading":{"type":"string"},"text":{"type":"string"}}}},"today":{"type":"string","format":"date"},"assets":{"type":"array","maxItems":200,"items":{"type":"object","required":["key","media_type","content_base64"],"properties":{"key":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$"},"media_type":{"type":"string","enum":["image/png","image/jpeg"]},"content_base64":{"type":"string"}}}}}}}}},"responses":{"200":{"description":"PDF renderöity","content":{"application/json":{"schema":{"type":"object","properties":{"pdf_base64":{"type":"string"},"sha256":{"type":"string"},"size_bytes":{"type":"integer"},"missing_placeholders":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Virheellinen syöte tai julkaisematon pohja"},"404":{"description":"Pohjaa ei löytynyt"}}}},"/documents/seal":{"post":{"summary":"Sinetöi PDF ilman allekirjoittajia","description":"Asiakirja, jolla ei ole allekirjoittajia mutta jonka aitous on voitava todentaa myöhemmin (esim. todistus tai vuosilaskelma). Löytyy tämän jälkeen `GET /verify?sha256=…`-reitiltä. `metadata` upotetaan PDF:n audit-liitteeksi ja on PYSYVÄ — älä koskaan lähetä siinä henkilötunnusta; pyyntö hylätään, jos siltä näyttävä arvo havaitaan.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":255},"content_base64":{"type":"string"},"upload_id":{"type":"string","format":"uuid"},"reason":{"type":"string","maxLength":200},"metadata":{"type":"object","additionalProperties":true},"retain_years":{"type":"integer","minimum":1,"maximum":10,"description":"Säilytysaika vuosina, jonka jälkeen sinetöity tiedosto poistetaan. Puuttuva = ei automaattista poistoa. Ohitetaan, jos organisaatio on kytkenyt arkiston säilytysajan pois."}}}}}},"responses":{"201":{"description":"Asiakirja sinetöity","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"sealed_sha256":{"type":"string"},"page_count":{"type":"integer"},"size_bytes":{"type":"integer"},"retain_until":{"type":"string","format":"date","nullable":true},"download_url":{"type":"string"}}}}}},"400":{"description":"Virheellinen PDF, tuntematon upload_id tai henkilötunnus metatiedoissa"}}}},"/templates":{"get":{"summary":"Listaa käytettävissä olevat asiakirjapohjat","description":"Palauttaa järjestelmäpohjat ja kutsujan omat pohjat, myös julkaisua odottavat. `usable` kertoo, voiko pohjaa käyttää `POST /documents/render` -kutsussa juuri nyt. Pohjan HTML:ää ei palauteta: sen lähde on integroijan omassa repossa.","responses":{"200":{"description":"Pohjat","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"key":{"type":"string"},"name":{"type":"string"},"version":{"type":"integer"},"published":{"type":"boolean"},"owner":{"type":"string","enum":["system","tenant"]},"usable":{"type":"boolean"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}}}},"put":{"summary":"Vie oma asiakirjapohja","description":"Luo tai päivittää kutsujan oman pohjan. Idempotentti avaimen ja version suhteen. **Pohja ei julkaistu tämän kutsun jälkeen**: julkaisu tehdään erikseen juridisen sisällön tarkistuksen jälkeen, joten uusi pohja ei ole heti käytettävissä renderöinnissä. Jo julkaistua versiota ei ylikirjoiteta — vastauksen `action` on silloin `skipped_published`, ja muutos on tehtävä uutena versiona.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["key","name","version","html"],"properties":{"key":{"type":"string","pattern":"^[a-z0-9_]+$","maxLength":100},"name":{"type":"string","maxLength":200},"version":{"type":"integer","minimum":1,"maximum":999},"html":{"type":"string","maxLength":1000000},"schema":{"type":"object","additionalProperties":true},"legal_basis":{"type":"string","maxLength":2000}}}}}},"responses":{"200":{"description":"Pohja päivitetty tai ohitettu julkaistuna"},"201":{"description":"Pohja luotu"},"400":{"description":"Virheellinen syöte"}}}},"/uploads":{"post":{"summary":"Luo signed upload URL:n suurelle PDF:lle","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["filename","size_bytes"],"properties":{"filename":{"type":"string"},"size_bytes":{"type":"integer","maximum":26214400}}}}}},"responses":{"201":{"description":"Latauslinkki luotu","content":{"application/json":{"schema":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"signed_upload_url":{"type":"string"},"token":{"type":"string"}}}}}}}}},"/usage":{"get":{"summary":"Käyttökooste ja laskutuksen erittely kuukaudelta","description":"Palauttaa kuukauden käyttötapahtumat koosteena (`summary`) sekä laskutuksen erittelyn (`billing`) organisaation laskutusmallin mukaan. Tilitoimistolle hinta perustuu aktiivisten asiakasyhtiöiden määrään marginaaliportaittain (`billing.model = \"per_company\"`, `billing.subscription` sisältää porrastuksen); muille organisaatioille kappalehintaan (`billing.model = \"per_signature\"`, `billing.subscription = null`). Tilitoimistomallissa kuukausihintaan sisältyvät pöytäkirjat ja tilinpäätökset — muut asiakirjat laskutetaan kappalehinnalla, ja jako näkyy kentissä `included_signatures` ja `billable_signatures`. Summat ovat kuukauden arvio; lopullinen laskun peruste otetaan kuukauden vaihtuessa.","parameters":[{"name":"month","in":"query","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$"},"description":"VVVV-KK, Europe/Helsinki-vyöhykkeellä. Oletus: kuluva kuukausi."}],"responses":{"200":{"description":"Kooste","content":{"application/json":{"schema":{"type":"object","properties":{"month":{"type":"string"},"summary":{"type":"object","properties":{"strong_signature":{"type":"integer"},"light_signature":{"type":"integer"},"sms":{"type":"integer"},"total":{"type":"integer"}}},"billing":{"type":"object","properties":{"model":{"type":"string","enum":["per_company","per_signature"]},"currency":{"type":"string"},"billing_cycle":{"type":"string","enum":["annual","monthly"]},"subscription":{"type":"object","nullable":true,"description":"Yhtiöpohjainen kuukausimaksu porrastuksineen. null kappalehintaisella organisaatiolla.","properties":{"active_companies":{"type":"integer"},"billed_companies":{"type":"integer"},"minimum_companies":{"type":"integer"},"tier_breakdown":{"type":"array","items":{"type":"object","properties":{"price_per_company_eur":{"type":"number"},"companies":{"type":"integer"},"amount_eur":{"type":"number"}}}},"base_monthly_amount_eur":{"type":"number"},"monthly_amount_eur":{"type":"number"},"annual_amount_eur":{"type":"number"}}},"included_signatures":{"type":"object","description":"Kuukausihintaan sisältyvät allekirjoitukset.","properties":{"strong_signature":{"type":"integer"},"light_signature":{"type":"integer"},"total":{"type":"integer"}}},"billable_signatures":{"type":"object","description":"Kappalehinnalla laskutettavat allekirjoitukset.","properties":{"strong_signature":{"type":"integer"},"light_signature":{"type":"integer"},"total":{"type":"integer"}}},"per_signature":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"quantity":{"type":"integer"},"unit_price_eur":{"type":"number","nullable":true},"amount_eur":{"type":"number"}}}},"amount_eur":{"type":"number"}}},"total_amount_eur":{"type":"number"}}}}}}}},"400":{"description":"Virheellinen kuukausi","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/identifications":{"post":{"summary":"Luo vahvan tunnistuksen pyynnön ilman allekirjoitusta","description":"Käytä, kun tarvitset vain varmistuksen siitä, kuka käyttäjä on, esimerkiksi ennen keskustelun avaamista. Vastauksen url avataan käyttäjän selaimessa (täysi sivunavaus, ei iframe). Käyttäjä tunnistautuu pankkitunnuksilla tai mobiilivarmenteella ja palaa return_url-osoitteeseen, johon eSinetti lisää parametrit identification_id, status (completed, failed tai cancelled) ja oman state-arvosi. Paluuosoite ei kerro tunnistetun henkilön tietoja: hae tulos GET /identifications/{id} -kutsulla tai ota se vastaan webhookina (identification.completed).\n\nPaluuosoitteen domain pitää olla organisaation Asetuksissa kohdassa Sallitut domainit (upotus); muuten pyyntö hylätään koodilla 422. Linkki on kertakäyttöinen ja voimassa oletuksena 60 minuuttia (expires_in_minutes 5–1440). Linkki on avain tunnistukseen: älä lokita sitä äläkä anna sitä muulle kuin tunnistautuvalle käyttäjälle.\n\nLaskutus: onnistunut tunnistus kirjataan yhtenä vahvana tunnistuksena (sama kappalehinta ja kuukausikatto kuin vahvalla allekirjoituksella). Epäonnistuneesta tai perutusta ei veloiteta.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["return_url"],"properties":{"return_url":{"type":"string","format":"uri","description":"https-osoite sallitulla domainilla."},"external_ref":{"type":"string","maxLength":200,"description":"Oma viitteesi, palautuu tuloksessa."},"state":{"type":"string","maxLength":200,"description":"Oma tilasi (esim. CSRF-suoja). Palautuu paluuosoitteessa sellaisenaan."},"expires_in_minutes":{"type":"integer","minimum":5,"maximum":1440,"default":60}}}}}},"responses":{"201":{"description":"Tunnistuspyyntö luotu","content":{"application/json":{"schema":{"type":"object","required":["id","status","url","expires_at"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending"]},"url":{"type":"string","format":"uri","description":"Ohjaa käyttäjä tähän osoitteeseen."},"expires_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Validointivirhe","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"401":{"description":"Virheellinen API-avain","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"403":{"description":"Organisaation kuukausittainen tunnistuskatto on täynnä","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"422":{"description":"Paluuosoitteen domain ei ole sallittujen domainien listalla (tai lista on tyhjä)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"503":{"description":"Toiminto ei ole vielä käytössä tässä ympäristössä","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/identifications/{id}":{"get":{"summary":"Hakee tunnistuspyynnön tilan ja tuloksen","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Tunnistuspyyntö","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","started","completed","failed","cancelled","expired"],"description":"pending = linkkiä ei ole vielä avattu tunnistukseen, started = tunnistus on kesken, completed = onnistui, failed = epäonnistui, cancelled = käyttäjä perui, expired = linkki vanheni."},"external_ref":{"type":"string","nullable":true},"created_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time","nullable":true},"result":{"type":"object","nullable":true,"description":"Vain onnistuneella tunnistuksella. Sisältää vain nimen, tunnistustavan, ajan ja tapahtumatunnuksen: henkilötunnusta ja syntymäaikaa ei palauteta.","properties":{"name":{"type":"string"},"auth_method":{"type":"string","nullable":true,"description":"Esim. op, nordea, mobiilivarmenne."},"provider_transaction_id":{"type":"string","nullable":true},"identified_at":{"type":"string","format":"date-time","nullable":true}}}}}}}},"404":{"description":"Ei löytynyt (tai kuuluu toiselle organisaatiolle)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}},"/verify":{"get":{"summary":"Julkinen aitoustarkistus (EI vaadi API-avainta)","description":"Tarkistaa onko annettu SHA-256-tiiviste eSinetin sinetöimä asiakirja ja palauttaa allekirjoitustapahtumat ilman henkilötunnisteita (ei hetua, ei syntymäaikaa, ei sähköpostia). Julkinen ja tenant-riippumaton — kuka tahansa jolla on sinetöity PDF (ja voi siis laskea sen tiivisteen) voi tarkistaa sen aitouden. IP-pohjainen rate limit (30/min).","security":[],"parameters":[{"name":"sha256","in":"query","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"},"description":"Asiakirjan (sinetöidyn PDF:n) SHA-256-tiiviste heksadesimaalina."}],"responses":{"200":{"description":"Tulos (found: false jos tiivistettä ei löydy — tämä ei ole virhe)","content":{"application/json":{"schema":{"type":"object","properties":{"found":{"type":"boolean"},"document":{"type":"object","nullable":true,"properties":{"name":{"type":"string"},"page_count":{"type":"integer"},"sealed_sha256":{"type":"string"}}},"round":{"type":"object","nullable":true,"properties":{"title":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"sealed_at":{"type":"string","format":"date-time","nullable":true}}},"organization":{"type":"string","nullable":true},"signers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"auth_method":{"type":"string","nullable":true},"provider":{"type":"string","nullable":true},"signed_at":{"type":"string","format":"date-time"},"provider_transaction_id":{"type":"string","nullable":true}}}}}}}}},"400":{"description":"Virheellinen sha256-parametri","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}},"429":{"description":"Liikaa pyyntöjä","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}}}}}}