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.