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

# Generate subscription links

> Générer des liens de préférence de communication pour un ou une abonné(e). Ce point de terminaison vous permet de créer des URL pour gérer les préférences et se désabonner, avec une adaptation à un ou une  abonné(e) spécifique. Il est utile pour intégrer la gestion des préférences de communication dans vos applications.

export const ScopesList = ({scopes = [], description = "Cette API requiert l'une des portées suivantes :"}) => {
  if (!scopes || scopes.length === 0) {
    return null;
  }
  const sortedScopes = scopes.sort((a, b) => a.localeCompare(b));
  return <div>
      <div className="text-sm mb-2">{description}</div>
      <div>
        {sortedScopes.map((scope, index) => <div key={index}>
            <code>
              <span className="text-xs">{scope}</span>
            </code>
          </div>)}
      </div>
    </div>;
};

export const SupportedProducts = ({marketing, sales, service, cms, marketingLevel, salesLevel, serviceLevel, cmsLevel}) => {
  const translations = {
    header: "Produits pris en charge",
    description: "Exige l'un des produits suivants ou un produit supérieur.",
    productNames: {
      marketing: "Marketing Hub",
      sales: "Sales Hub",
      service: "Service Hub",
      cms: "Content Hub"
    },
    tiers: {
      free: "Gratuit",
      starter: "Starter",
      professional: "Pro",
      enterprise: "Entreprise"
    }
  };
  const translateTier = tier => {
    if (!tier) return '';
    const lowerTier = tier.toLowerCase();
    return translations.tiers[lowerTier] || tier;
  };
  const products = [{
    name: marketing ? translations.productNames.marketing : '',
    level: translateTier(marketingLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/marketing-bolt.svg",
    alt: "Marketing Hub"
  }, {
    name: sales ? translations.productNames.sales : '',
    level: translateTier(salesLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/sales-star.svg",
    alt: "Sales Hub"
  }, {
    name: service ? translations.productNames.service : '',
    level: translateTier(serviceLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/service-heart.svg",
    alt: "Service Hub"
  }, {
    name: cms ? translations.productNames.cms : '',
    level: translateTier(cmsLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/content-play.svg",
    alt: "Content Hub"
  }].filter(product => product.name && product.level);
  if (products.length === 0) return null;
  return <div>
      <div className="text-sm mb-2">{translations.description}</div>
      <div className={`grid ${products.length === 1 ? 'grid-cols-1' : 'grid-cols-2'} gap-1.5`}>
        {products.map((product, index) => <div key={index} style={{
    display: 'flex',
    alignItems: 'center'
  }}>
            <img src={product.icon} alt={product.alt} className="w-3.5 h-3.5 mr-1.5 mt-2.5 mb-2.5 flex-shrink-0 align-middle" />
            <span className="font-medium mr-1 text-sm">{product.name} -</span>
            <span className="text-sm">{product.level}</span>
          </div>)}
      </div>
    </div>;
};

<AccordionGroup>
  <Accordion title="Supported products" defaultOpen="true" icon="cubes">
    <SupportedProducts marketing={true} sales={true} service={true} cms={true} marketingLevel="STARTER" salesLevel="FREE" serviceLevel="FREE" cmsLevel="FREE" />
  </Accordion>

  <Accordion title="Required Scopes" icon="key">
    <ScopesList
      scopes={[
  'communication_preferences.read',
  'communication_preferences.write',
  'communication_preferences.read_write'
]}
    />
  </Accordion>
</AccordionGroup>


## OpenAPI

````yaml specs/2026-03/communication-preferences-subscriptions-v2026-03.json POST /communication-preferences/2026-03/links/generate
openapi: 3.0.1
info:
  title: Communication Preferences Subscriptions
  description: Basepom for all HubSpot Projects
  version: 2026-03
  x-hubspot-product-tier-requirements:
    marketing: STARTER
    sales: FREE
    service: FREE
    cms: FREE
    commerce: FREE
    crmHub: FREE
    dataHub: FREE
servers:
  - url: https://api.hubapi.com
security: []
tags:
  - name: Batch
  - name: Definitions
  - name: Status
paths:
  /communication-preferences/2026-03/links/generate:
    post:
      tags:
        - Status
      summary: Générer des liens d'abonnement
      description: >-
        Générer des liens de préférence de communication pour un ou une
        abonné(e). Ce point de terminaison vous permet de créer des URL pour
        gérer les préférences et se désabonner, avec une adaptation à un ou une 
        abonné(e) spécifique. Il est utile pour intégrer la gestion des
        préférences de communication dans vos applications.
      operationId: >-
        post-/communication-preferences/2026-03/links/generate_/communication-preferences/v4/links/generate
      parameters:
        - name: channel
          in: query
          description: >-
            Le canal de communication pour lequel les liens sont générés. Doit
            être « EMAIL ».
          required: true
          style: form
          explode: true
          schema:
            type: string
            enum:
              - EMAIL
        - name: businessUnitId
          in: query
          description: "L'identifiant de l'unité commerciale. La valeur par défaut est\_0 si non spécifiée."
          required: false
          style: form
          explode: true
          schema:
            type: integer
            format: int64
            default: 0
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LinkGenerationRequest'
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LinkGenerationResponse'
        default:
          $ref: '#/components/responses/Error'
          description: ''
      security:
        - oauth2:
            - communication_preferences.read
            - communication_preferences.write
        - oauth2:
            - communication_preferences.read_write
components:
  schemas:
    LinkGenerationRequest:
      required:
        - subscriberIdString
      type: object
      properties:
        language:
          type: string
          description: >-
            La langue dans laquelle le lien généré doit être présenté,
            représentée sous forme de chaîne de caractères.
        subscriberIdString:
          type: string
          description: >-
            Une chaîne représentant l'identifiant unique de l'abonné. Cette
            propriété est obligatoire.
        subscriptionId:
          type: integer
          description: >-
            L'identifiant unique de l'abonnement, représenté sous forme d'entier
            au format int64.
          format: int64
    LinkGenerationResponse:
      required:
        - managePreferencesUrl
        - subscriberIdString
        - unsubscribeAllUrl
      type: object
      properties:
        managePreferencesUrl:
          type: string
          description: >-
            L'adresse URL où l'abonné peut gérer ses préférences de
            communication.
        subscriberIdString:
          type: string
          description: Une chaîne représentant l'identifiant unique de l'abonné.
        unsubscribeAllUrl:
          type: string
          description: >-
            Une chaîne contenant l'URL permettant de désabonner l'abonné de
            toutes les communications.
        unsubscribeSingleUrl:
          type: string
          description: >-
            Une chaîne contenant l'URL permettant de désabonner l'abonné d'une
            communication unique.
    Error:
      required:
        - category
        - correlationId
        - message
      type: object
      properties:
        category:
          type: string
          description: La catégorie d'erreur
        context:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
          description: Contexte concernant la condition d'erreur
          example: >-
            {invalidPropertyName=[propertyValue], missingScopes=[scope1,
            scope2]}
        correlationId:
          type: string
          description: >-
            Un identifiant unique pour la demande. Incluez cette valeur dans
            tous les rapports d'erreurs ou tickets d'assistance
          format: uuid
          example: aeb5f871-7f07-4993-9211-075dc63e7cbf
        errors:
          type: array
          description: informations supplémentaires à propos de l'erreur
          items:
            $ref: '#/components/schemas/ErrorDetail'
        links:
          type: object
          additionalProperties:
            type: string
          description: >-
            Une carte des noms de liens vers les URI associés contenant de la
            documentation sur l'erreur ou les mesures correctives recommandées
        message:
          type: string
          description: >-
            Un message lisible par la personne décrivant l'erreur ainsi que les
            mesures correctives possibles, le cas échéant
          example: An error occurred
        subCategory:
          type: string
          description: >-
            Une catégorie spécifique qui contient des détails plus précis sur
            l'erreur
      example:
        message: Invalid input (details will vary based on the error)
        correlationId: aeb5f871-7f07-4993-9211-075dc63e7cbf
        category: VALIDATION_ERROR
        links:
          knowledge-base: https://www.hubspot.com/products/service/knowledge-base
    ErrorDetail:
      required:
        - message
      type: object
      properties:
        code:
          type: string
          description: Le code du statut associé au détail de l'erreur
        context:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
          description: Contexte concernant la condition d'erreur
          example: '{missingScopes=[scope1, scope2]}'
        in:
          type: string
          description: Le nom du champ ou du paramètre dans lequel l'erreur a été trouvée.
        message:
          type: string
          description: >-
            Un message lisible par la personne décrivant l'erreur ainsi que les
            mesures correctives possibles, le cas échéant
        subCategory:
          type: string
          description: >-
            Une catégorie spécifique qui contient des détails plus précis sur
            l'erreur
  responses:
    Error:
      description: An error occurred.
      content:
        '*/*':
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    oauth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://app.hubspot.com/oauth/authorize
          tokenUrl: https://api.hubapi.com/oauth/v1/token
          scopes:
            communication_preferences.read_write: ''
            communication_preferences.statuses.batch.read: ''
            communication_preferences.statuses.batch.write: ''

````