> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Licensnycklar

> Generera och leverera unika licensnycklar med aktiveringsgränser och utgångsdatum. Licensnycklarna är av entitetstypen Licensnyckel. De utfärdas automatiskt vid betalning, kopplas till prenumerationslivscykeln och återkallas vid avbokning eller återbetalning.

<Frame>
  <iframe className="w-full aspect-video rounded-md" src="https://www.youtube.com/embed/BNuLTXok8dQ" title="License Keys | Dodo Payments" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowFullScreen />
</Frame>

<Info>
  Licensnycklar är av entitetstypen Licensnyckel. Skapa en licensnyckel-entitet en gång med den aktiveringsgräns, utgångsdatum och instruktioner du önskar, koppla den till vilken produkt som helst, och Dodo Payments genererar och levererar en nyckel per köp eller prenumerationsplats, automatiskt.
</Info>

## Vad är Licensnycklar?

Licensnycklar är unika token som auktoriserar åtkomst till din produkt. De är idealiska för:

* **Programvarulicensering**: Skrivbordsappar, plugins och CLIs
* **Per-användarkontroller**: Begränsa aktiveringar per användare eller enhet
* **Digitala varor**: Stänga av nedladdningar, uppdateringar eller premiumfunktioner

I Dodo Payments hanteras licensnycklar genom systemet [Entitlements](/features/entitlements/introduction), vilket innebär att livscykeln för varje nyckel (skapande, utgång, återkallande, återgivning) drivs av samma betalnings- och prenumerationshändelser som dina andra leveranser.

## Skapa en Licensnyckel Entitlement

<Steps>
  <Step title="Open Entitlements">
    Gå till **Entitlements** i din Dodo Payments-instrumentpanel och klicka på **+** för att skapa en ny entitlement.
  </Step>

  <Step title="Choose License Key">
    Välj **License Key** som integration. Konfigurera hur varje utfärdad nyckel beter sig:

    * **Aktiveringsbegränsningar**: Maximalt antal samtidiga aktiveringar per nyckel (t.ex., `1` för enanvändarlicens, `5` för teamlicenser, lämna tom för obegränsat).
    * **Varaktighet**: Hur lång tid nyckeln förblir giltig efter utfärdande (t.ex., 30 dagar, 1 år). För prenumerationsutgivna nycklar, lämna tom; nycklar förblir giltiga så länge prenumerationen är aktiv.
    * **Aktiveringsinstruktioner**: Kundanvisningar som skickas med nyckeln till e-post. Exempel: `Paste the key in Settings → License` eller `Run: mycli activate <key>`.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/sZYZEc6Biy3IrQNZ/images/entitlements/license-keys/create.png?fit=max&auto=format&n=sZYZEc6Biy3IrQNZ&q=85&s=65f24596e834387d0c35278ef92d14ea" alt="License Key entitlement form with activation limit, duration, and instructions" style={{ maxHeight: '500px', width: 'auto' }} width="2840" height="1614" data-path="images/entitlements/license-keys/create.png" />
    </Frame>
  </Step>

  <Step title="Save the entitlement">
    Spara. Entitlement är nu tillgänglig att koppla till vilken produkt som helst.
  </Step>
</Steps>

## Koppla till Produkter

Öppna en produkt, expandera **Avancerade inställningar → Entitlements & Credits**, och välj din Licensnyckel-entitlement. En enskild produkt kan leverera en licensnyckel tillsammans med andra entitlements (Discord-åtkomst, filnedladdningar, GitHub-repoåtkomst, etc.) vid samma köp.

<Frame caption="Selecting the License Key entitlement in the product entitlements panel.">
  <img src="https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/attach-to-product.png?fit=max&auto=format&n=do-W-dMDGVB_xzr_&q=85&s=965ad78262791fa8dbb712b4fdf89538" alt="Product entitlements panel with License Key selected" style={{ maxHeight: '500px', width: 'auto' }} width="2000" height="1197" data-path="images/entitlements/attach-to-product.png" />
</Frame>

***

## Hur nycklar utfärdas

Nyckelutfärdande följer standarden [grant lifecycle](/features/entitlements/introduction#how-grants-work):

| Event                                          | Beteende                                                                                                                              |
| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `payment.succeeded` (one-time)                 | Generera en nyckel per `quantity` köpt. Nyckelns utgång respekterar entitetsperioden.                                                 |
| `subscription.active`                          | Generera en nyckel per prenumeration `quantity` (seat). Nyckeln har ingen utgång; giltigheten är kopplad till prenumerationsstatus.   |
| `subscription.renewed`                         | No-op. Befintliga nycklar förblir.                                                                                                    |
| `subscription.on_hold`                         | Inaktivera nycklarna. De återaktiveras när prenumerationen inte längre är pausad.                                                     |
| `subscription.cancelled` / `expired`           | Inaktivera nycklarna permanent.                                                                                                       |
| `subscription.plan_changed`                    | Inaktivera de gamla nycklarna; utfärda nya för den nya planen.                                                                        |
| `refund.succeeded` (one-time)                  | Inaktivera nycklarna.                                                                                                                 |
| Manuell återkallelse via API/instrumentpanelen | Inaktivera nycklarna med `revocation_reason: manual`. Dessa återges inte automatiskt vid prenumerationsförnyelse.                     |
| Licensnyckel inaktiverad direkt                | Återkalla beviljandet med `revocation_reason: license_key_disabled`. Återaktivering av nyckeln återaktiverar beviljandet automatiskt. |

### Kvantitetsbeteende

* **Prenumerationsprodukter** utfärdar en nyckel per plats (`subscriptions.quantity`).
* **Engångsprodukter** utfärdar en nyckel per kassaartikel (`product_cart.quantity`).
* **Manuella API-beviljanden** utfärdar exakt en nyckel.

## Aktivering, Validering, Inaktivering

API-slutpunkterna för aktivering/validering/inaktivering är **offentliga** och kräver ingen API-nyckel. Använd dem direkt från skrivbordsprogramvara, CLI:er eller webbläsarbaserade klienter för att verifiera nycklar vid körning.

<Info>
  **Offentliga Slutpunkter**: Aktivera, inaktivera och validera licensslutpunkterna är offentliga och kräver ingen API-nyckel. Anropa dem direkt från dina klientapplikationer utan att exponera dina API-uppgifter.
</Info>

### Aktivera en licens

<CodeGroup>
  ```typescript TypeScript theme={null} theme={null}
  import DodoPayments from 'dodopayments';

  // No API key needed for public license endpoints
  const client = new DodoPayments();

  const response = await client.licenses.activate({
    license_key: 'PRO-AAAA-BBBB-CCCC-DDDD',
    name: 'Device Name',
  });

  console.log(response.id);
  ```

  ```python Python theme={null} theme={null}
  client.licenses.activate(
      license_key="PRO-AAAA-BBBB-CCCC-DDDD",
      name="Device Name",
  )
  ```

  ```bash cURL theme={null} theme={null}
  curl -X POST https://test.dodopayments.com/licenses/activate \
    -H "Content-Type: application/json" \
    -d '{
      "license_key": "PRO-AAAA-BBBB-CCCC-DDDD",
      "name": "Device Name"
    }'
  ```
</CodeGroup>

### Validera en licens

<CodeGroup>
  ```typescript TypeScript theme={null} theme={null}
  const response = await client.licenses.validate({
    license_key: 'PRO-AAAA-BBBB-CCCC-DDDD',
  });

  console.log(response.valid);
  ```

  ```bash cURL theme={null} theme={null}
  curl -X POST https://test.dodopayments.com/licenses/validate \
    -H "Content-Type: application/json" \
    -d '{ "license_key": "PRO-AAAA-BBBB-CCCC-DDDD" }'
  ```
</CodeGroup>

### Inaktivera en aktiveringsinstans

```typescript theme={null} theme={null}
await client.licenses.deactivate({
  license_key: 'PRO-AAAA-BBBB-CCCC-DDDD',
  license_key_instance_id: 'instance_abc123',
});
```

***

## Hantera Nycklar

När en kund köper en produkt i manuellt läge skapas beviljandet i `pending`-status utan nyckel och en [`entitlement_grant.created`](/developer-resources/webhooks/intents/entitlement-grant) webhook utlöses med `integration_type: "license_key"` och `status: "pending"`. Du kan reagera på den webbhooken, eller undersöka [List Customer Grants](/api-reference/entitlements/list-customer-grants) endpointen med `integration_type` och `status` filter:

```typescript theme={null} theme={null}
const pending = await client.customers.listEntitlementGrants('customer_id', {
  integration_type: 'license_key',
  status: 'Pending',
});
```

```typescript theme={null} theme={null}
const grants = await client.entitlements.grants.list('ent_license_key_id', {
  status: 'delivered',
});

for (const grant of grants.items) {
  console.log(grant.license_key.key, grant.license_key.activations_used);
}
```

## Importera Befintliga Licensnycklar via API

Har du redan licensnycklar i ett annat system? Använd [Create License Key](/api-reference/licenses/create-license-key) API för att importera dem till Dodo Payments. Detta låter dig migrera befintliga nycklar utan att störa dina kunder – de fortsätter att aktivera, validera och inaktivera mot samma nyckelsträngar utan återskapande.

<Warning>
  Licensnycklar skapade eller uppdaterade via API utlöser inga e-postmeddelanden till kunder. Om du behöver meddela kunder om en importerad nyckel, hantera det separat i din applikation.
</Warning>

```typescript theme={null} theme={null}
const licenseKey = await client.licenseKeys.create({
  customer_id: 'cus_abc123',
  product_id: 'prod_456',
  key: 'YOUR-EXISTING-LICENSE-KEY',
  activations_limit: 5,
  expires_at: '2026-12-31T23:59:59Z',
});
```

### Skillnaden mellan importerade och automatgenererade nycklar

| Fält                    | Automatgenererad nyckel                             | Importerad nyckel                        |
| ----------------------- | --------------------------------------------------- | ---------------------------------------- |
| `source`                | `"auto"`                                            | `"import"`                               |
| `payment_id`            | Ställ in på ursprunglig betalning                   | `null` (ingen Dodo Payments transaktion) |
| `subscription_id`       | Ställ in om nyckeln utfärdades via en prenumeration | `null` om inte explicit länkat           |
| Kundens e-postavisering | Sänds vid utfärdande                                | Skickas inte — hantera separat           |

Använd `source`-fältet på `GET /license_keys`-svar för att särskilja migrerat lager från organiskt utfärdade nycklar vid avstämning eller revision.

<Tip>
  Migrerar du från **Polar.sh** eller **Lemon Squeezy**? [`dodo-migrate` CLI](/migrate-to-dodo) automatiserar massimporter av produkter, kunder, rabatter och licensnycklar i ett enda kommando och mappar externa ID:n till Dodo ID:n automatiskt.
</Tip>

***

## Licensnycklar i Return URL

När en kund slutför ett köp för en produkt med en Licensnyckel-entitlement, läggs den genererade nyckeln automatiskt till din `return_url` som en frågeparameter. Detta låter dig visa nyckeln omedelbart på din nätsida utan att göra en extra API-anrop.

```text theme={null} theme={null}
https://yoursite.com/return?payment_id=pay_xxx&status=succeeded&license_key=LK-001&email=customer%40example.com
```

Om köpet genererar flera nycklar (kvantitet > 1), kommer de att separeras med kommatecken:

```text theme={null} theme={null}
https://yoursite.com/return?payment_id=pay_xxx&status=succeeded&license_key=LK-001,LK-002&email=customer%40example.com
```

För prenumerationer används `subscription_id` istället för `payment_id`:

```text theme={null} theme={null}
https://yoursite.com/return?subscription_id=sub_xxx&status=active&license_key=LK-001&email=customer%40example.com
```

<Tip>
  Analysera `license_key`-parametern på din återvändningssida för att visa nyckeln omedelbart, vilket förbättrar köpupplevelsen.
</Tip>

***

## API-hantering

<AccordionGroup>
  <Accordion title="Lifecycle Operations (Public Endpoints)">
    Aktivering, inaktivering, och validering är offentliga; ingen API-nyckel krävs.

    <CardGroup cols={3}>
      <Card title="Activate License" icon="code" href="/api-reference/licenses/activate-license">
        Skapa eller registrera en aktiveringsinstans för en licensnyckel.
      </Card>

      <Card title="Deactivate License" icon="code" href="/api-reference/licenses/deactivate-license">
        Återkalla en tidigare aktivering för att frigöra kapacitet.
      </Card>

      <Card title="Validate License" icon="code" href="/api-reference/licenses/validate-license">
        Kontrollera äkthet, status och begränsningar innan du beviljar åtkomst.
      </Card>
    </CardGroup>
  </Accordion>

  <Accordion title="License Key Management">
    Skapa, lista, hämta och uppdatera individuella licensnyckelregister. Använd dessa för att importera befintliga nycklar eller hämta användningsdetaljer.

    <CardGroup cols={2}>
      <Card title="Create License Key" icon="code" href="/api-reference/licenses/create-license-key">
        Skapa en ny licensnyckel eller importera en befintlig.
      </Card>

      ```typescript theme={null} theme={null}
      const grants = await client.entitlements.grants.list('ent_license_key_id', {
        status: 'Delivered',
      });

      for (const grant of grants.items) {
        console.log(grant.license_key.key, grant.license_key.activations_used);
      }
      ```

      <Card title="Get License Key" icon="code" href="/api-reference/licenses/get-license-key">
        Hämta en specifik nyckel och dess metadata.
      </Card>

      <Card title="Update License Key" icon="code" href="/api-reference/licenses/update-license-key">
        Ändra utgång, aktiveringsgränser, eller aktivera/inaktivera en nyckel.
      </Card>
    </CardGroup>
  </Accordion>

  <Accordion title="Entitlement Management">
    Hantera själva Licensnyckel-entitlement: dess aktiveringsgräns, varaktighet och instruktioner.

    <CardGroup cols={2}>
      <Card title="Create Entitlement" icon="plus" href="/api-reference/entitlements/create-entitlement">
        Skapa en Licensnyckel-entitlement.
      </Card>

      <Card title="Update Entitlement" icon="pen" href="/api-reference/entitlements/update-entitlement">
        Uppdatera entitlement-konfigurationen.
      </Card>

      <Card title="List Grants" icon="users" href="/api-reference/entitlements/list-grants">
        Lista nycklarna som utfärdats för en entitlement.
      </Card>

      <Card title="Revoke Grant" icon="ban" href="/api-reference/entitlements/revoke-grant">
        Återkalla manuellt en kunds nyckel.
      </Card>
    </CardGroup>
  </Accordion>
</AccordionGroup>

***

## Webhooks

Leverans och återkallande av licensnycklar utlöser de fyra [`entitlement_grant.*` webhook-händelserna](/developer-resources/webhooks/intents/entitlement-grant). Grant-payloaden inkluderar ett fyllt `license_key`-objekt med nyckeln, utgång, använda aktiveringar och gräns.

De äldre `license_key.*`-händelserna (`license_key.created`) fortsätter att avfyras för den underliggande licensnyckelns registerlivscykel; se sidan [License Key webhook payload](/developer-resources/webhooks/intents/license-key).

<Tip>
  För nya integrationer, lyssna på `entitlement_grant.delivered` istället för `license_key.created`. Entitlement-händelsen berättar att leveransen är komplett över alla integrationer på produkten, inte bara licensnyckeln.
</Tip>

***

## Äldre Licensnycklar

<Note>
  Produkter skapade med den äldre `license_key_enabled`-flaggan har blivit **automatiskt migrerade** till en Licensnyckel-entitlement. Migrationen är transparent: befintliga kunders nycklar fortsätter att fungera oförändrade, den offentliga `/licenses/activate`, `/licenses/validate`, `/licenses/deactivate`-slutpunkterna fortsätter att fungera, och `/license_keys/*` API-slutpunkterna fortsätter att läsa och skriva till samma nyckellager.

  Den fristående **License Keys** instrumentpanelssektionen förblir tillgänglig som en platt lista över varje utfärdad nyckel, användbar för revision och sökning. Nya konfigurationer (ändring av aktiveringsgränser, varaktigheter eller instruktioner) bör göras genom att redigera den migrerade Licensnyckel-entitlement under **Entitlements**.
</Note>

***

## Bästa Praxisen

* **Håll aktiveringsgränserna klara**: Välj rimliga standardvärden (1 för enanvändarappar, 3–5 för teamlicenser) och dokumentera dem.
* **Ge precisa aktiveringsinstruktioner**: Kunder klistrar in dessa från sina mejl, så exakta vägar och kommandon sparar supportärenden.
* **Validera nycklar server-side**: För nätverksanslutna produkter, validera via `/licenses/validate` istället för att cachea aktivering lokalt.
* **Använd webhooks för återkallelse**: Lyssna på `entitlement_grant.revoked` för att omedelbart inaktivera in-app funktioner när en kund avbokar eller får återbetalning.
* **Testa med prenumerationer och engångstillfällen**: Licensnyckelbeteende skiljer sig subtilt mellan de två, så testa båda innan du startar.

<Tip>
  Analysera `license_key`-parametern på din återvändningssida för att visa nyckeln omedelbart, vilket förbättrar köpupplevelsen.
</Tip>

***

## API-Management

<AccordionGroup>
  <Accordion title="Lifecycle Operations (Public Endpoints)">
    Aktivering, avaktivering och validering är offentliga; ingen API-nyckel krävs.

    <CardGroup cols={3}>
      <Card title="Activate License" icon="code" href="/api-reference/licenses/activate-license">
        Skapa eller registrera en aktiveringsinstans för en licensnyckel.
      </Card>

      <Card title="Deactivate License" icon="code" href="/api-reference/licenses/deactivate-license">
        Återkalla en tidigare aktivering för att frigöra kapacitet.
      </Card>

      <Card title="Validate License" icon="code" href="/api-reference/licenses/validate-license">
        Kontrollera äkthet, status och begränsningar innan åtkomst beviljas.
      </Card>
    </CardGroup>
  </Accordion>

  <Accordion title="License Key Management">
    Skapa, lista, hämta och uppdatera enskilda licensnyckelposter. Använd dessa för att importera befintliga nycklar eller hämta användningsinformation.

    <CardGroup cols={2}>
      <Card title="Create License Key" icon="code" href="/api-reference/licenses/create-license-key">
        Skapa en ny licensnyckel eller importera en befintlig.
      </Card>

      <Card title="List License Keys" icon="code" href="/api-reference/licenses/list-license-keys">
        Bläddra i alla nycklar med status och användningsinformation.
      </Card>

      <Card title="Get License Key" icon="code" href="/api-reference/licenses/get-license-key">
        Hämta en specifik nyckel och dess metadata.
      </Card>

      <Card title="Update License Key" icon="code" href="/api-reference/licenses/update-license-key">
        Modifiera utgång, aktiveringsgränser eller aktivera/inaktivera en nyckel.
      </Card>
    </CardGroup>
  </Accordion>

  <Accordion title="Entitlement Management">
    Hantera själva licensnyckelrätten: dess aktiveringsgräns, varaktighet och instruktioner.

    <CardGroup cols={2}>
      <Card title="Create Entitlement" icon="plus" href="/api-reference/entitlements/create-entitlement">
        Skapa en licensnyckelrättighet.
      </Card>

      <Card title="Update Entitlement" icon="pen" href="/api-reference/entitlements/update-entitlement">
        Uppdatera rättighetens konfiguration.
      </Card>

      <Card title="List Grants" icon="users" href="/api-reference/entitlements/list-grants">
        Lista nycklar som utfärdats för en rättighet.
      </Card>

      <Card title="Revoke Grant" icon="ban" href="/api-reference/entitlements/revoke-grant">
        Manuellt återkalla en kunds nyckel.
      </Card>
    </CardGroup>
  </Accordion>
</AccordionGroup>

***

## Webbhooks

Leverans och återkallande av licensnycklar utlöser de fyra [`entitlement_grant.*` webhook-händelserna](/developer-resources/webhooks/intents/entitlement-grant). Beviljandedatan innehåller ett ifyllt `license_key`-objekt med nyckel, utgång, användningsaktiveringar och gräns.

De äldre `license_key.*`-händelserna (`license_key.created`) fortsätter att utlösas för licensnyckelns livscykel; se [Licensnyckelns webhook-dataplast](/developer-resources/webhooks/intents/license-key).

<Tip>
  För nya integrationer, lyssna på `entitlement_grant.delivered` snarare än `license_key.created`. Rättighetshändelsen berättar för dig att leveransen är klar över alla produktens integrationer, inte bara licensnyckeln.
</Tip>

***

## Legacy Licensnycklar

<Note>
  Produkter skapade med den äldre `license_key_enabled`-flaggan har **automatiskt migrerats** till en licensnyckelrätt. Migreringen är transparent: befintliga kunders nycklar fortsätter att fungera oförändrade, de offentliga `/licenses/activate`, `/licenses/validate`, `/licenses/deactivate`-ändpunkterna fortsätter att fungera, och `/license_keys/*` API-ändpunkterna fortsätter att läsa och skriva till samma nyckellager.

  Den fristående **Licensnycklar**-dashboardsektionen finns kvar som en platt lista över varje utfärdad nyckel, användbar för revision och sökning. Ny konfiguration (ändra aktiveringsgränser, varaktigheter eller instruktioner) bör göras genom att redigera den migrerade licensnyckelrättigheten under **Rättigheter**.
</Note>

***

## Best Practices

* **Håll aktiveringsgränser tydliga**: Välj rimliga standardvärden (1 för enanvändarappar, 3–5 för teamlicenser) och dokumentera dem.
* **Ge precisa aktiveringsinstruktioner**: Kunder klistrar in dessa från sin e-post, så exakta sökvägar och kommandon sparar supportärenden.
* **Validera nycklar server-sida**: För nätverksanslutna produkter, validera via `/licenses/validate` istället för att cachea aktiveringen lokalt.
* **Använd webhooks för återkallande**: Lyssna på `entitlement_grant.revoked` för att omedelbart inaktivera appfunktioner när en kund avbryter eller återbetalar.
* **Testa med prenumerationer och engångsköp**: Licensnyckelbeteendet skiljer sig subtilt mellan de två, så testa båda innan de tas i bruk.
