How do I add a software license and manage seats?
Quick answer
Section titled “Quick answer”A license always belongs to a software entry (software_id). You record
the license type, seats, seats used, cost, currency,
purchase date, and expiry date. The seat count is tracked as a
counter (seats = total, seats_used = used) — the data model does not
assign individual seats to specific people or assets.
Prerequisites
Section titled “Prerequisites”In-app license management is its own license feature (licenses) and
available from the Pro tier onward. It manages your software licenses
as inventory — not the product license of Notory itself.
Instructions
Section titled “Instructions”In the web interface, license data comes together on the Software page: the “Total License Cost” and “Expiring Soon” stat cards, as well as the warning list of expiring licenses, are calculated from your license records.
software-lizenz-01 Software page with the 'Total License Cost' and 'Expiring Soon' cards above the software list Adding and changing individual license records (seats, cost, expiry date) currently happens via the API — see the adjacent tab. For how to evaluate costs and remaining terms, see License Costs & Expiry at a Glance.
Create a license: POST to /api/v1/software/licenses. The software_id
(the ID of the associated software entry) is required.
curl -X POST https://demo.notory.io/api/v1/software/licenses \ -H "Authorization: Bearer inv_dein_token" \ -H "Content-Type: application/json" \ -d '{ "software_id": "0f9c2a71-4d6b-4e18-9a3c-2b7e1f0d8c44", "license_type": "subscription", "license_key": "XXXX-YYYY-ZZZZ", "seats": 25, "seats_used": 18, "cost": 1499.00, "currency": "EUR", "purchase_date": "2026-01-01", "expiry_date": "2026-12-31", "vendor": "Adobe" }'Response HTTP 201 Created:
{ "id": "7a1e5c90-2f83-4b6d-8c11-9d4a2e6b0f37", "tenant_id": "3d9b0c12-4e5a-4f88-b1c7-2a9e6d4f0011", "software_id": "0f9c2a71-4d6b-4e18-9a3c-2b7e1f0d8c44", "license_type": "subscription", "seats": 25, "seats_used": 18, "cost": 1499.0, "currency": "EUR", "purchase_date": "2026-01-01", "expiry_date": "2026-12-31", "vendor": "Adobe", "created_at": "2026-07-08T09:20:00Z", "updated_at": "2026-07-08T09:20:00Z"}Adjusting seats (e.g. one more assignment): a PUT to the license ID
with the new seats_used value — it’s enough to send the changed field.
curl -X PUT https://demo.notory.io/api/v1/software/licenses/7a1e5c90-2f83-4b6d-8c11-9d4a2e6b0f37 \ -H "Authorization: Bearer inv_dein_token" \ -H "Content-Type: application/json" \ -d '{ "seats_used": 19 }'Valid license_type values: perpetual (Perpetual), subscription
(Subscription, default), and trial (Trial). seats must be at least 1,
seats_used at least 0; currency is a 3-letter code (default EUR).
Possible errors: 401 (token missing/invalid), 403 (no permission or
the License module is not in your tier), 422 (validation — e.g. missing
software_id or seats < 1).
What happens behind the scenes?
Section titled “What happens behind the scenes?”- Link to the software: The license is linked to a software entry via
software_id. If the software is deleted, its licenses are deleted along with it (cascade). - Seats as counters:
seatsandseats_usedare plain numeric fields. Notory does not enforce an upper limit and does not tie seats to individual users or assets — keeping the used-seats count accurate is up to you. - Cost & expiry feed the overview:
cost/currencyadd up to the Total License Cost; anexpiry_datewithin the next 30 days counts toward the “Expiring Soon” metric. - Audit trail: Creator/editor are recorded as
created_by/updated_by. - Tenant isolation: Licenses are tenant-bound and invisible to other tenants.
Related topics
Section titled “Related topics”- Add software — add the software first, then the license
- License costs & expiry at a glance
- Software approval process
- API introduction — authentication, base URL, error codes