# Developers page strings (English): quickstart · keys · endpoints · webhooks · coverage · metering · CLI. key=value; merged into Resources/UiMessages.resx by tools/ui-strings.py.
ui.dev.sub=Everything an engineer needs to integrate: snippets, keys, endpoints, webhooks, coverage, metering and the CLI.
ui.dev.lockedHint=Included in a higher plan — see plans to unlock.
ui.dev.tryIt=Try it
ui.dev.yes=yes
ui.dev.no=no
ui.dev.tab.quickstart=Quickstart
ui.dev.tab.keys=Keys
ui.dev.tab.endpoints=Endpoints
ui.dev.tab.webhooks=Webhooks
ui.dev.tab.coverage=Coverage
ui.dev.tab.metering=Metering
ui.dev.tab.cli=CLI
# quickstart
ui.dev.qs.title=Add the SDK to your app
ui.dev.qs.lead=Pick the product and your language. The snippet is prefilled with the product slug, its public key and this instance's URL — paste it in and activate with any key you've issued.
ui.dev.qs.install=Install
ui.dev.qs.needProduct=Create a product first
ui.dev.qs.needProductBody=Snippets and keys belong to a product. Create one and come back here.
ui.dev.qs.noKey=No signing key yet.
ui.dev.qs.noKeyBody=This product has no public key, so the SDK can't verify licenses. Generate one under the product's signing key, then reload this page.
ui.dev.qs.nextTitle=Next steps
ui.dev.qs.s1=Paste the snippet and build with the public key embedded.
ui.dev.qs.s2=Issue a test license and activate with its key.
ui.dev.qs.s3=Watch the device appear on the license's Devices tab.
ui.dev.qs.s4=Connect your store so paid orders issue keys automatically.
ui.dev.qs.howTitle=How the SDK behaves
ui.dev.qs.how1=Activation binds the key to the machine and returns a short-lived signed lease; the SDK caches it and renews it quietly, so brief offline periods never lock the user out.
ui.dev.qs.how2=Validation never throws. Anything that doesn't verify — wrong product, expired, revoked, tampered clock — resolves to the free state so your app keeps running.
ui.dev.qs.how3=The public key is not a secret: it ships in your binary. Security comes from the private key staying on the server.
# keys
ui.dev.keys.tenant=Workspace signing key
ui.dev.keys.tenantBody=Products without their own key are signed with this one. Embed it as PublicKeyBase64 in the SDK.
ui.dev.keys.none=No signing key is configured for this workspace yet.
ui.dev.keys.noneProduct=This product has no key of its own and the workspace has none either — generate one on the product page.
ui.dev.keys.ownKey=This product has its own signing key. Embed this one:
ui.dev.keys.usesTenant=Uses the workspace signing key above.
ui.dev.keys.manage=Manage signing key
ui.dev.keys.previous=Previous keys ({0})
ui.dev.keys.previousHint=Keep these in AdditionalPublicKeysBase64 until every lease and offline file signed with them has expired; then drop them to finish the rotation.
ui.dev.keys.revList=Download revocation list
ui.dev.keys.revListDone=Revocation list for {0} downloaded
ui.dev.keys.howTitle=How keys work
ui.dev.keys.how1=Every license, lease and offline file is signed server-side; the SDK verifies with the public key you embed and never needs the private key.
ui.dev.keys.how2=Rotation is safe: generate a new key on the product page, ship the new public key and keep the old one in AdditionalPublicKeysBase64 until nothing signed with it is still in use.
ui.dev.keys.how3=Offline builds can't see revocations — ship the signed revocation list with your next update and point the SDK at it.
ui.dev.keys.howSnippet=KeyrightOptions (.NET)
# endpoints
ui.dev.ep.title=Your endpoints
ui.dev.ep.lead=The URLs your app and your store talk to. All client endpoints are authenticated by the license key itself — no token needed.
ui.dev.ep.base=Base URL
ui.dev.ep.activateUrl=Activate URL
ui.dev.ep.validateUrl=Validate URL
ui.dev.ep.webhook=Webhook URL
ui.dev.ep.slug=Workspace slug
ui.dev.ep.examples=Client endpoints
ui.dev.ep.examplesLead=The SDKs call these for you. Use them directly from other runtimes, scripts or a CI smoke test.
ui.dev.ep.activate=Activate a device
ui.dev.ep.activateBody=Binds the key to a machine id and takes a seat. Re-activating the same machine is idempotent; one seat too many returns a seat-limit status and no lease.
ui.dev.ep.validate=Validate (renew the lease)
ui.dev.ep.validateBody=Same shape as activate, but never takes a new seat. Call it on launch or on a timer to pick up renewals, seat changes and revocations.
ui.dev.ep.freeSeat=Free a seat
ui.dev.ep.freeSeatBody=Releases the machine's seat so another device can activate. The SDK calls this on deactivate.
ui.dev.ep.trial=Start a free trial
ui.dev.ep.trialBody=Public and CORS-open so your website can post it. Issues a trial key for products with trials enabled and emails it — the key is never in the response. Work email required; one trial per email per product.
ui.dev.ep.response=Response
ui.dev.ep.notesTitle=Good to know
ui.dev.ep.n1=Client endpoints are rate-limited; a 429 means wait a moment and retry.
ui.dev.ep.n2=Send the product slug on every call — a key never activates for the wrong product.
ui.dev.ep.n3=hostname, os and appVersion are optional but make the Devices tab useful.
ui.dev.ep.n4=Admin endpoints take X-Admin-Token (a team member token works too). Never ship an admin token in a client.
# webhooks: fulfilment (inbound)
ui.dev.wh.title=Fulfilment webhook
ui.dev.wh.lead=Your store (or a thin adapter in front of it) posts a normalised event here. A paid order issues a license — idempotent per order reference — and a refund or cancellation revokes it.
ui.dev.wh.signature=Signature header
ui.dev.wh.payload=Payload
ui.dev.wh.payloadBody=A paid event needs type, orderRef, licensee and product; tier, seats, email and expiryUtc are optional. A refund or cancel needs only type and the same orderRef.
ui.dev.wh.refundLabel=Refund or cancellation
ui.dev.wh.recipes=Provider recipes
ui.dev.wh.recipeLead=Map these {0} events to the Keyright event type and post the payload above from a small webhook handler (a serverless function is enough).
ui.dev.wh.providerEvent=Provider event
ui.dev.wh.sendType=Send as type
ui.dev.wh.recipeNote=Use the provider's order or transaction id as orderRef, and the buyer's name and email as licensee and email (look the customer up if the event only carries a customer id). Send the same orderRef on the refund or cancel event so Keyright can find the license to revoke.
ui.dev.wh.signing=Signing
ui.dev.wh.signingBody=Compute a hex HMAC-SHA256 of the exact bytes you send, keyed with your webhook secret, and put it in X-Keyright-Signature. The body must not be re-serialised after signing.
ui.dev.wh.rotate=Rotate secret…
ui.dev.wh.rotateDo=Rotate
ui.dev.wh.rotateBody=A new secret is generated and the old one stops working immediately. Any adapter still signing with the old secret will be rejected until you update it.
ui.dev.wh.rotateNote=The new secret is shown once. Only the owner can rotate it.
ui.dev.wh.rotated=Secret rotated
ui.dev.wh.secretTitle=Save this secret now — it won't be shown again.
ui.dev.wh.secretBody=Put it in your webhook adapter's configuration, then send a test event.
ui.dev.wh.secret=Webhook secret
ui.dev.wh.savedIt=I've saved it
# webhooks: event webhook (outbound)
ui.dev.ev.title=Event webhook
ui.dev.ev.lead=Keyright posts credit-pool events (credit.pool.low, credit.pool.exhausted) to a URL you own, signed with a secret, with retries. Your billing or alerting reacts to them.
ui.dev.ev.lockTitle=Outbound event webhooks are included in a higher plan.
ui.dev.ev.lockBody=You can see the configuration and delivery log here; turning delivery on needs an upgrade.
ui.dev.ev.off=Off
ui.dev.ev.statusOn=Delivering to {0}.
ui.dev.ev.statusOff=No URL set — nothing is delivered.
ui.dev.ev.secretSet=A signing secret is set.
ui.dev.ev.secretNotSet=No secret yet — one is generated when you save a URL.
ui.dev.ev.urlHint=An absolute https URL that accepts POST and returns 2xx. Keyright retries on anything else.
ui.dev.ev.rotate=Rotate the signing secret
ui.dev.ev.rotateHint=generates a new secret on save; the old one stops working immediately.
ui.dev.ev.enable=Enable delivery
ui.dev.ev.saved=Event webhook saved
ui.dev.ev.secretTitle=Save this secret now — it won't be shown again.
ui.dev.ev.secretBody=Verify X-Keyright-Signature on every delivery with it (hex HMAC-SHA256 of the raw body).
ui.dev.ev.disable=Disable delivery
ui.dev.ev.disableBody=Delivery stops and the URL is cleared. The secret is kept, so re-enabling later doesn't rotate it.
ui.dev.ev.disabled=Event webhook disabled
ui.dev.ev.deliveries=Recent deliveries
ui.dev.ev.allStatus=All statuses
ui.dev.ev.pending=Pending
ui.dev.ev.delivered=Delivered
ui.dev.ev.failed=Failed
ui.dev.ev.event=Event
ui.dev.ev.at=When
ui.dev.ev.attempts=Attempts
ui.dev.ev.nextAttempt=next try {0}
ui.dev.ev.lastError=Last error
ui.dev.ev.noDeliveries=No deliveries yet
ui.dev.ev.noDeliveriesBody=Credit events show up here as they're queued, delivered or give up after the retry cap.
ui.dev.ev.payload=What a delivery looks like
ui.dev.ev.payloadBody=One JSON event per POST, with a fixed key order so you can verify the signature over the raw bytes. Respond 2xx quickly and process asynchronously; anything else is retried with back-off, up to 6 attempts, then marked failed.
# coverage
ui.dev.cov.buildTitle=Bake release metadata into your build
ui.dev.cov.buildLead=Set these MSBuild properties in your release pipeline. The Keyright.NET package turns them into compile-time constants so the running build knows which release it is (Node, Python and Java have equivalents).
ui.dev.cov.b1=KeyrightCoverageVersion is the semantic version of this release; KeyrightCoverageEntitlementDate is the date coverage is judged against — normally the release date, or the base release's date for a hotfix. Both fall back to the assembly version when unset.
ui.dev.cov.b2=KeyrightCoverageChannel (stable, beta…) lets a license include or exclude pre-release builds.
ui.dev.cov.b3=KeyrightRequireCoverage turns on runtime coverage: Validate() then reports this build's coverage on LicenseInfo.Coverage (read from the cached block, offline), and CheckCoverageAsync() is the authoritative check that silently refreshes before refusing. A miss never locks the user out — your app decides. Builds without it ignore coverage entirely.
ui.dev.cov.b4=A miss never prompts for the key again. The SDK reports NotCovered (or CoverageUnavailableOffline when it can't refresh) and your app decides what to do: inform, run read-only or block.
ui.dev.cov.sdkTitle=Ask the SDK
ui.dev.cov.sdkLead=For your own in-app messaging or updater — Keyright decides coverage; it never distributes builds or checks for updates.
ui.dev.cov.sdkNote=NewestCoveredVersion is only known when you register releases (Releases & coverage). A license with no coverage configured reports NotConfigured and counts as covered.
ui.dev.cov.apiTitle=Eligibility API
ui.dev.cov.apiLead=Call this from your own download page or update server: given a customer's key and a target version, is that version covered and is the license still valid?
ui.dev.cov.apiNote=eligible is licenseValid combined with coverage; a license with coverage not configured is never restricted. Leave on out to use the version's registered entitlement date. Authenticated by the key itself and rate-limited like other client endpoints.
ui.dev.cov.tryTitle=Try it
ui.dev.cov.tryLead=Paste a key and a version to see exactly what your download page would get.
ui.dev.cov.anyChannel=any channel
ui.dev.cov.eligible=Eligible — covered and the license is valid.
ui.dev.cov.notEligible=Not eligible.
ui.dev.cov.licenseValid=License valid
ui.dev.cov.reason=Reason
# metering
ui.dev.met.adminTitle=Meter from your backend
ui.dev.met.adminLead=Name the action; Keyright prices it from the product's action costs and deducts from the right pool. Write capability; use dryRun to pre-check without deducting.
ui.dev.met.a1=idempotencyKey makes retries safe: the same key never deducts twice (idempotent is true on a replay).
ui.dev.met.a2=status is ok, insufficient, unknown_action (no cost defined for that action on the product), no_pool or not_found; balance is what's left after the deduction.
ui.dev.met.a3=Define action costs per product (POST /admin/products/{slug}/action-costs) so one call covers every metered feature.
ui.dev.met.clientTitle=Meter from the app itself
ui.dev.met.clientLead=A licensed desktop or edge app meters its own credits with the license key — no admin token in the client. The SDKs wrap both calls.
ui.dev.met.clientNote=Rate-limited per IP like activation. Pass pool to read a single pool's balance.
ui.dev.met.tryTitle=Try it (dry run)
ui.dev.met.tryLead=Prices the action against a real license without deducting anything.
ui.dev.met.tryDry=Price it (dry run)
ui.dev.met.action=Action
ui.dev.met.quantity=Quantity
ui.dev.met.idem=Idempotency key
ui.dev.met.idemPh=optional, e.g. job-8841
ui.dev.met.idemHint=Optional. Replaying the same key returns the first result instead of deducting again.
ui.dev.met.wouldDeduct=Would deduct {0} {1}.
ui.dev.met.refused=Refused — status {0}.
ui.dev.met.unitCost=Unit cost
ui.dev.met.balance=Balance after
ui.dev.met.pool=Pool
ui.dev.met.idempotent=Replay
# cli
ui.dev.cli.installTitle=Install the CLI
ui.dev.cli.installLead=The keyright command is a .NET global tool. It issues, signs and lists licenses, prints machine ids, builds revocation lists and registers releases — handy for scripts and CI.
ui.dev.cli.envLead=Point it at this instance once with environment variables (or pass --url and --admin-token on each call):
ui.dev.cli.verbsTitle=Commands
ui.dev.cli.keygen=Generate a per-product signing keypair for development and tests (production keys are generated on the product page).
ui.dev.cli.licenseNew=Mint an online LIC- key, recorded on the server. --months or --expiry set the term; --trial marks a trial; --entitlement key=value is repeatable.
ui.dev.cli.licenseSign=Produce a signed offline license file with a private key — for air-gapped customers. --machine node-locks it to a fingerprint.
ui.dev.cli.licenseList=Read-only list of licenses from the issuing service.
ui.dev.cli.licenseBulk=Bulk-issue from a CSV of licensee,seats,expiry (blank expiry = perpetual).
ui.dev.cli.licenseBulkOps=Revoke the keys in a CSV (one per line), or change seat counts from a CSV of id,seats.
ui.dev.cli.machineId=Print this machine's node-lock fingerprint — what a customer sends you for an offline lease.
ui.dev.cli.revList=Produce a signed revocation list to ship with your next update (from the server, or locally with --private-key and --revoked).
ui.dev.cli.release=Register or list release metadata for coverage: version, release date, entitlement date and channel.
ui.dev.cli.notesTitle=Good to know
ui.dev.cli.n1=Exit codes: 0 success, 2 usage error, 1 anything else — safe to gate a pipeline on.
ui.dev.cli.n2=Set KEYRIGHT_LANG to change the CLI's language (en, fr).
ui.dev.cli.n3=Everything the CLI does is also an admin API call — see Endpoints — so any HTTP client works too.

ui.dev.keys.advanced=Advanced: previous keys and revocation list
ui.dev.wh.advanced=Advanced: rotate the webhook secret
