Documentation · SoftActivate Licensing

Statuses and errors

There are three families of results, in the order you typically meet them: validation statuses describe the license's verdict, configuration errors mean your integration is set up wrong and should be fixed rather than retried, and transport errors mean the call itself failed.

Validation statuses

After validate_license / ValidateLicenseAsync, the result carries one status. Native constants are SWS_LICENSE_STATUS_*; .NET uses the LicenseStatus enum.

Native .NET Meaning - and what your application should do
VALID Valid Proceed. Persist the updated license if one was issued.
NOT_FOUND NotFound The license key does not exist for your vendor id. This usually means a typo in the key, or a key from a different tenant. Have the customer re-enter it.
BAD_SIGNATURE BadSignature The stored license fails verification, usually because it is corrupted or was tampered with. Delete the local file and re-activate online.
EXPIRED Expired The license is past its validity. For subscriptions this usually resolves itself at the next online validation, since renewal is a form of re-issuance; for fixed-term licenses, prompt the customer to renew or purchase.
NOT_YET_VALID NotYetValid Validity starts in the future, almost always because the device clock is wrong. Tell the customer to fix the clock; do not disable features silently.
REVOKED Revoked The license was revoked in the console, for example after a refund, a chargeback, or a leaked key. Deny the licensed functionality and direct the customer to support. This is also detected offline, through the cached revocation list.
BAD_CONTEXT BadContext The license belongs to a different device, because the hardware changed beyond the allowed tolerance or the file was copied. Offer re-activation, and deactivate the old machine first if it still exists.
BAD_SCOPE BadScope The license carries no scope attribute at all — a malformed or hand-assembled license file, never a normally issued one. Delete the local file and re-activate online.
PAYMENT_REQUIRED PaymentRequired The subscription behind the license has lapsed. The status message carries the subscription state (past_due, canceled, and so on); show state-appropriate messaging, since "update your payment method" for past_due calls for a different conversation than canceled.
SEAT_LIMIT SeatLimit This is a floating license and every seat is leased. The status message carries the soonest lease expiry in seconds ("" if unknown), which is the earliest a retry can succeed. Offer "try again in a few minutes"; never retry in a tight loop.
BAD_PRODUCT BadProduct The license belongs to a different product than the one your app declared with set_product_id() / SetProductId. Tell the customer which product the key actually matches (it's on their receipt) and where to get the right one. Reported only when your app declares a product; licenses without a stamped product pass this check.

The forward-compatibility rule: future SDK and service versions may add new statuses. Treat an unknown status as invalid, never as probably fine.

Transport errors

Native Meaning
SWS_OK Success.
SWS_EFAIL Unknown/unclassified failure.
SWS_ENOTIMPL Not implemented.
SWS_EINVAL Invalid argument, including an offline-activation import whose reply does not match the pending file.
SWS_ENOMEM Out of memory.
SWS_EAUTH Authentication failed at the service.

In .NET these surface as exceptions: SwsException (the base class), SwsArgumentException for an invalid argument, and SwsServerException when the service rejected the call. Network unreachability during a renewal attempt is not fatal while the stored license is still valid, because the SDK validates locally. Design your UX so that a temporarily offline machine with a valid license never nags the customer.

Troubleshooting matrix

Symptom Likely cause Fix
Worked yesterday, BAD_CONTEXT today Hardware change beyond fingerprint tolerance, or copied license file Re-activate; deactivate the old machine if reachable
EXPIRED on a healthy subscription Machine offline past the renewal window Get online once; validation renews automatically
NOT_YET_VALID Device clock set in the past Fix the clock
SEAT_LIMIT with a retry hint All floating seats leased Wait out the hint; ensure clients deactivate on exit
NOT_FOUND for a key you minted moments ago Key mistyped (it was shown only once), or wrong vendor id Re-check both; mint a fresh license if the key is lost
BAD_PRODUCT on a key you sold The key belongs to a different product than the app declared (set_product_id) The customer bought product A and is running product B — point them at the right download or the right key

Still stuck? Write to support@softactivate.com with the status, the SDK version, and (for activation problems) your vendor id - never send license private keys or license.pending files.