Release notes · Changelog

Release notes — Everything new in the API as they happen.

The wthaiq API evolves continuously without breaking your integration. We pin the version with a dated header Wthaiq-Version: 2026-07-01: changes non-breaking — such as a new endpoint, an optional field or an event type — ship continuously on your same version, while changes that are breaking in a new dated version that does not affect you until you choose to upgrade yourself. This page documents every change with its date and its tag.

Read the documentation
Current stable version: v1 · 2026-07-01
The pinned dated version Wthaiq-Version: 2026-07-01
AddingChangingSecurity
AddingFix
Adding
ChangingDiscontinued
Current stable version · v1

Tag guide

Every change in the log is tagged with its colour and its type, so you can read its impact on your integration at a glance.

Adding Changing Fix Deprecation Security
Timeline

Versions Newest first.

All the beta versions and then the stable v1 release are listed with their exact dates and tags.

Test mode removed — key format unified
  • Substantive changeThe two-environment system was removed sk_live_/sk_test_. Every secret key now follows one unified format sk_ + 40 hexadecimal characters, and it is live from the moment it is created — there is no separate test mode, and the field livemode equals true always.
  • AddingPublishable keys in the format pk_ Safe to expose in the browser: locked to specific domains through allowed_origins, and limited to a fixed set of paths (templates, signature requests, signers, flows) with writes to templates/signers/flows blocked.
  • SecurityEvery API call — with any key type — is genuinely charged against your prepaid balance (EGP 20 per signature request, plus EGP 35 per signer who requires identity verification). There is no test environment exempt from billing.
Stable version v1
  • AddingThe Signature Requests API was released publicly at the path POST /v1/signature_requests with the full lifecycle (draft then sent then completed) and the endpoints send andcancel andreminders anddownload andcertificate.
  • AddingWebhooks signed through the header Wthaiq-Signature (HMAC-SHA256 in t=..,v1=..) with a 300-second tolerance window and escalating retries for up to 24 hours.
  • AddingAPI keys in the two forms sk_live_ andsk_test_, and the Webhook signing secret whsec_; test mode does not send real email and does not issue legal certificates. Note (2026-07-26): This two-environment system was removed later — see the top of the changelog.
  • AddingOfficial first-class SDKs — @wthaiq/node andwthaiq (Python) andwthaiq/wthaiq-php — they pin the version header by default and follow SemVer.
  • Changingbecame Wthaiq-Version: 2026-07-01 is the default dated version for all new accounts, with the header Wthaiq-Request-Id in every response.
  • SecurityTLS 1.2 or higher was made mandatory, and rotation of the Webhook secret was made available whsec_ from the dashboard, with no service interruption.
Ready contract templates beta
  • AddingThe templates endpoint (ready-made contracts): GET /v1/templates andGET /v1/templates/{id} with the field definitions (key andlabel andtype andrequired).
  • AddingCreate a signature request directly from a template via source.type = "template" passing the field values in signers[].fields.
  • FixFixed the computation of default field values when the object is absent fields from the request body.
Public verification by reference number beta
  • AddingThe public verification endpoint by reference number: GET /v1/verifications/{reference} (codes WTQ- andWTH-) without authentication, to check the integrity of the document and its parties.
  • AddingField integrity with the values intact andmodified andunknown in the object verification, with the names of the parties masked.
  • AddingEvent verification.created to the Webhooks event list.
Embedded signing sessions beta
  • AddingWhite-label embedded signing sessions: POST /v1/signers/{id}/signing_session Issues a short-lived signing link/token for embedding inside your app under your own brand.
  • ChangingAdded the field signing_url to the object signer to support the hosted and the embedded page through the same field.
  • FixStrict adherence of embedded tokens to expires_at and invalidate it as soon as signing is completed or declined.
Identity verification (AES) through Didit beta
  • AddingIdentity verification for the advanced level (AES) through Didit — the object identity_verification and the endpoint GET /v1/identity_verifications/{id} (official document + live face match).
  • AddingGateway require_identity at the request and signer levels, and the two events signer.otp_verified andsigner.identity_verified.
  • AddingSupport legal_level = "aes" which ties the signature to a verified real person before the signing page opens.
PAdES-LT sealing and DSS/LTV preservation beta
  • AddingSeal pades-lt with DSS/LTV (embedded certificates + OCSP + CRL) for long-term preservation and for verification without contacting the issuing authority.
  • Changingbecame format = "pades-lt" The default value for requests at the level aes instead of pades-t.
  • AddingEvent document.sealed Fired when the CMS/PAdES signature is embedded in the final PDF file.
Platform fundamentals (first public beta) beta
  • AddingAn RFC 3161 timestamp on every signature (level pades-t) to prove the moment of signing independently.
  • ChangingAll endpoints share a single error envelope { error: { type, code, message, param, request_id } } with standard HTTP codes (400/401/402/409/422/429).
  • AddingSupport for the header Idempotency-Key on requests POST (stored for 24 hours) to make retries safe.
  • AddingThe rate limit is 100 requests per 10 seconds, with the headers X-RateLimit-Limit andRemaining andReset, and a 429 code accompanied byRetry-After.
  • DeprecationDeprecation of the old undated preview path /v1/preview in favour of the new dated version; the endpoint will be removed in a later dated version.
Versioning policy

How we ship changes without breaking your integration.

We follow date-based versioning. The behaviour of your pinned version never changes through a breaking change — you alone decide when to upgrade it.

Breaking changes

Require a new dated version

  • Removing an endpoint, a field or a value enum, or renaming it.
  • Changing the type of an existing field (for example from string to integer).
  • Adding a required parameter (required) to an existing request.
  • Tightening validation rules so that requests previously accepted are now rejected.
  • Changing the default semantics of a response, or the order of the items in a list.

Non-breaking changes

ship continuously on your same version

  • Adding an entirely new endpoint.
  • Adding a new field Optional into a response body.
  • Adding a value enum new (handle unknown values gracefully).
  • Adding a new Webhook event type to the list.
  • Adding a new optional parameter to an existing request.
The deprecation window: We announce any deprecation in this changelog with a "Deprecation" tag, and we send the header Wthaiq-Deprecation on the responses concerned, and we keep the old behaviour working for at least 6 months before removing it in a new dated version — leaving enough time to upgrade safely.

Pin the version by sending the header Wthaiq-Version with every request. If you do not send it, the last dated version pinned to your account is used (or the latest default version). The behaviour of your pinned version never changes through a breaking change:

pin-version.sh
curl https://wthaiq.com/api/v1/signature_requests \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"

# The response returns the version actually used in the header:
# Wthaiq-Version: 2026-07-01
# Wthaiq-Request-Id: req_9f2a1c
Upgrade deliberately: When you are ready to adopt a newer dated version, review its differences in this changelog, try it first with a small request on your account (there is no separate test key — the request is real and billed), then switch the value of Wthaiq-Version in production. There is no need to upgrade all at once — each integration upgrades at its own pace.

Ready to build your integration?

Start from the full API documentation, pin your dated version, and subscribe to receive every update as it ships.