> ## 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.

# Create or update a batch of projects

> Créez ou mettez à jour un lot d'objets CRM à l'aide de leurs valeurs de propriétés uniques. Ce point de terminaison permet de gérer efficacement plusieurs objets en une seule requête, en garantissant que chaque objet est créé ou mis à jour en fonction des identifiants uniques fournis.

> **Supported products**

> **Required Scopes**


## OpenAPI

````yaml specs/2026-09/crm-projects-v2026-09.json POST /crm/objects/2026-09/projects/batch/upsert
openapi: 3.0.1
info:
  title: CRM Projects
  description: Basepom for all HubSpot Projects
  version: 2026-09
  x-hubspot-product-tier-requirements:
    marketing: FREE
    sales: FREE
    service: FREE
    cms: FREE
    commerce: FREE
    crmHub: FREE
    dataHub: FREE
servers:
  - url: https://api.hubapi.com
security: []
tags:
  - name: Advanced
  - name: Basic
  - name: Batch
  - name: Search
paths:
  /crm/objects/2026-09/projects/batch/upsert:
    post:
      tags:
        - Batch
      summary: Mettre à jour des objets par lot
      description: >-
        Créez ou mettez à jour un lot d'objets CRM à l'aide de leurs valeurs de
        propriétés uniques. Ce point de terminaison permet de gérer efficacement
        plusieurs objets en une seule requête, en garantissant que chaque objet
        est créé ou mis à jour en fonction des identifiants uniques fournis.
      operationId: >-
        post-/crm/objects/2026-09/projects/batch/upsert_/crm/objects/2026-09-beta/{objectType}/batch/upsert
      parameters: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/BatchInputSimplePublicObjectBatchInputUpsert
        required: true
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchResponseSimplePublicUpsertObject'
        '207':
          description: multiple statuses
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/BatchResponseSimplePublicUpsertObjectWithErrors
        default:
          $ref: '#/components/responses/Error'
          description: ''
      security:
        - oauth2:
            - crm.objects.deals.read
        - oauth2:
            - crm.objects.subscriptions.read
        - oauth2:
            - crm.objects.services.read
        - oauth2:
            - crm.objects.tickets.sensitive.read
        - oauth2:
            - crm.objects.orders.read
        - oauth2:
            - crm.objects.listings.write
        - oauth2:
            - crm.objects.custom.read
        - oauth2:
            - crm.objects.companies.write
        - oauth2:
            - crm.objects.tasks.read
        - oauth2:
            - crm.objects.custom.sensitive.write.v2
        - oauth2:
            - crm.objects.custom.highly_sensitive.write.v2
        - oauth2:
            - crm.objects.companies.read
        - oauth2:
            - crm.objects.appointments.sensitive.read.v2
        - oauth2:
            - crm.objects.contacts.highly_sensitive.read.v2
        - oauth2:
            - crm.objects.tickets.highly_sensitive.read
        - oauth2:
            - crm.objects.companies.sensitive.read.v2
        - oauth2:
            - crm.objects.tickets.sensitive.write
        - oauth2:
            - media_bridge.read
        - oauth2:
            - crm.objects.deals.highly_sensitive.read.v2
        - oauth2:
            - crm.objects.contacts.highly_sensitive.write.v2
        - oauth2:
            - crm.objects.companies.highly_sensitive.read.v2
        - oauth2:
            - crm.objects.commercepayments.write
        - oauth2:
            - crm.objects.invoices.write
        - oauth2:
            - crm.objects.contacts.sensitive.write.v2
        - oauth2:
            - crm.objects.calls.read
        - oauth2:
            - crm.objects.users.write
        - oauth2:
            - crm.objects.meetings.read
        - oauth2:
            - crm.objects.custom.sensitive.read.v2
        - oauth2:
            - crm.objects.users.read
        - oauth2:
            - crm.objects.partner-services.read
        - oauth2:
            - crm.objects.orders.write
        - oauth2:
            - crm.objects.partner-services.write
        - oauth2:
            - crm.objects.appointments.write
        - oauth2:
            - crm.objects.projects.highly_sensitive.write
        - oauth2:
            - crm.objects.carts.write
        - oauth2:
            - crm.objects.tickets.highly_sensitive.write
        - oauth2:
            - crm.objects.commercepayments.read
        - oauth2:
            - crm.objects.products.write
        - oauth2:
            - crm.objects.feedback_submissions.read
        - oauth2:
            - crm.objects.services.write
        - oauth2:
            - crm.objects.subscriptions.write
        - oauth2:
            - crm.objects.deals.sensitive.write.v2
        - oauth2:
            - crm.objects.contacts.read
        - oauth2:
            - crm.objects.appointments.sensitive.write.v2
        - oauth2:
            - crm.objects.projects.highly_sensitive.read
        - oauth2:
            - crm.objects.invoices.read
        - oauth2:
            - crm.objects.custom.write
        - oauth2:
            - tickets.sensitive.v2
        - oauth2:
            - crm.objects.deals.write
        - oauth2:
            - e-commerce
        - oauth2:
            - crm.objects.appointments.read
        - oauth2:
            - crm.objects.projects.read
        - oauth2:
            - crm.objects.companies.sensitive.write.v2
        - oauth2:
            - crm.objects.companies.highly_sensitive.write.v2
        - oauth2:
            - crm.objects.deals.highly_sensitive.write.v2
        - oauth2:
            - crm.objects.custom.highly_sensitive.read.v2
        - oauth2:
            - crm.objects.goals.write
        - oauth2:
            - crm.objects.projects.sensitive.read
        - oauth2:
            - crm.objects.line_items.write
        - oauth2:
            - crm.objects.contacts.write
        - oauth2:
            - crm.objects.goals.read
        - oauth2:
            - crm.objects.line_items.read
        - oauth2:
            - crm.objects.partner-clients.write
        - oauth2:
            - crm.objects.projects.write
        - oauth2:
            - crm.objects.projects.sensitive.write
        - oauth2:
            - crm.objects.deals.sensitive.read.v2
        - oauth2:
            - crm.objects.quotes.write
        - oauth2:
            - tickets.highly_sensitive.v2
        - oauth2:
            - crm.objects.leads.read
        - oauth2:
            - crm.objects.leads.write
        - oauth2:
            - crm.objects.carts.read
        - oauth2:
            - crm.objects.emails.read
        - oauth2:
            - crm.objects.quotes.read
        - oauth2:
            - crm.objects.courses.write
        - oauth2:
            - crm.objects.partner-clients.read
        - oauth2:
            - crm.objects.notes.read
        - oauth2:
            - crm.objects.courses.read
        - oauth2:
            - crm.objects.listings.read
        - oauth2:
            - crm.objects.contacts.sensitive.read.v2
        - oauth2:
            - crm.objects.products.read
components:
  schemas:
    BatchInputSimplePublicObjectBatchInputUpsert:
      required:
        - inputs
      type: object
      properties:
        inputs:
          type: array
          description: >-
            Un tableau d'objets SimplePublicObjectBatchInputUpsert, chacun
            contenant les propriétés et les identifiants d'un objet CRM à créer
            ou à mettre à jour. Ce tableau est obligatoire.
          items:
            $ref: '#/components/schemas/SimplePublicObjectBatchInputUpsert'
      description: >-
        Représente une opération d'entrée par lot pour l'upsert d'objets publics
        simples dans HubSpot. Cet élément est utilisé pour traiter plusieurs
        opérations d'upsert en une seule requête, améliorant ainsi l'efficacité
        et les performances.
    BatchResponseSimplePublicUpsertObject:
      required:
        - completedAt
        - results
        - startedAt
        - status
      type: object
      properties:
        completedAt:
          type: string
          description: >-
            La date et l'heure auxquelles l'opération de lot a été effectuée, au
            format ISO 8601.
          format: date-time
        links:
          type: object
          additionalProperties:
            type: string
          description: >-
            Une carte des noms de liens vers les URI associées, fournissant un
            contexte ou des actions supplémentaires liés à l'opération par lot.
        requestedAt:
          type: string
          description: >-
            La date et l'heure auxquelles l'opération de lot a été demandée, au
            format ISO 8601.
          format: date-time
        results:
          type: array
          description: >-
            Un tableau de résultats de l'opération d'upsert par lot, chacun
            représenté comme un SimplePublicUpsertObject.
          items:
            $ref: '#/components/schemas/SimplePublicUpsertObject'
        startedAt:
          type: string
          description: >-
            La date et l'heure de début de l'opération par lot, au format ISO
            8601.
          format: date-time
        status:
          type: string
          description: "Le statut actuel de l'opération par lot. Les valeurs valides incluent «\_PENDING\_», «\_PROCESSING\_», «\_CANCELED\_» et «\_COMPLETE\_»."
          enum:
            - CANCELED
            - COMPLETE
            - PENDING
            - PROCESSING
      description: >-
        Représente le résultat d'une opération d'upsert par lots, y compris le
        statut de l'opération, les horodatages et une liste d'objets créés ou
        mis à jour avec succès.
    BatchResponseSimplePublicUpsertObjectWithErrors:
      required:
        - completedAt
        - results
        - startedAt
        - status
      type: object
      properties:
        completedAt:
          type: string
          description: >-
            La date et l'heure auxquelles l'opération de lot a été effectuée, au
            format ISO 8601.
          format: date-time
        errors:
          type: array
          description: >-
            Un tableau d'éléments StandardError détaillant les erreurs survenues
            pendant l'opération par lot.
          items:
            $ref: '#/components/schemas/StandardError'
        links:
          type: object
          additionalProperties:
            type: string
          description: >-
            Une carte des noms de liens vers les URI associées, fournissant des
            informations ou des actions supplémentaires liées à l'opération de
            lot.
        numErrors:
          type: integer
          description: Le nombre total d'erreurs rencontrées pendant l'opération par lot.
          format: int32
        requestedAt:
          type: string
          description: >-
            La date et l'heure auxquelles l'opération de lot a été demandée, au
            format ISO 8601.
          format: date-time
        results:
          type: array
          description: >-
            Un tableau d'éléments SimplePublicUpsertObject représentant les
            résultats de l'opération d'upsert.
          items:
            $ref: '#/components/schemas/SimplePublicUpsertObject'
        startedAt:
          type: string
          description: >-
            La date et l'heure de début de l'opération par lot, au format ISO
            8601.
          format: date-time
        status:
          type: string
          description: "Le statut actuel de l'opération par lot. Les valeurs valides incluent «\_PENDING\_», «\_PROCESSING\_», «\_CANCELED\_» et «\_COMPLETE\_»."
          enum:
            - CANCELED
            - COMPLETE
            - PENDING
            - PROCESSING
      description: >-
        Représente la réponse d'une opération d'upsert par lots, incluant le
        statut, les horodatages, les objets traités avec succès et les erreurs
        survenues pendant le traitement.
    SimplePublicObjectBatchInputUpsert:
      required:
        - id
        - properties
      type: object
      properties:
        id:
          type: string
          description: >-
            Une chaîne de caractères représentant l'identifiant unique de
            l'objet à upserter.
        idProperty:
          type: string
          description: >-
            Une chaîne indiquant le nom de la propriété dont les valeurs sont
            uniques pour ce type d'objet.
        objectWriteTraceId:
          type: string
          description: >-
            Une chaîne utilisée pour tracer l'opération d'écriture à des fins de
            débogage ou de journalisation.
        properties:
          type: object
          additionalProperties:
            type: string
          description: >-
            Un objet contenant des paires clé-valeur représentant les propriétés
            de l'objet CRM. Chaque clé est un nom de propriété, et la valeur est
            la propriété.
      description: >-
        Représente un objet utilisé dans les opérations d'upsert par lot,
        contenant l'identifiant unique d'un objet, ses propriétés, et
        facultativement le nom de la propriété unique et un ID de trace
        d'écriture.
    SimplePublicUpsertObject:
      required:
        - archived
        - createdAt
        - id
        - new
        - properties
        - updatedAt
      type: object
      properties:
        archived:
          type: boolean
          description: Un booléen indiquant si l'objet est archivé.
        archivedAt:
          type: string
          description: La date et l'heure d'archivage de cet objet, au format ISO 8601.
          format: date-time
        createdAt:
          type: string
          description: La date et l'heure de création de cet objet, au format ISO 8601.
          format: date-time
        id:
          type: string
          description: >-
            L'identifiant unique de cet objet, représenté sous forme de chaîne
            de caractères.
        new:
          type: boolean
          description: Un booléen indiquant si cet objet est nouvellement créé.
        objectWriteTraceId:
          type: string
          description: Chaîne utilisée pour tracer les opérations d'écriture de cet objet.
        properties:
          type: object
          additionalProperties:
            type: string
          description: >-
            Une carte des noms de propriétés et de leurs valeurs, où chaque
            propriété est une chaîne de caractères.
        propertiesWithHistory:
          type: object
          additionalProperties:
            type: array
            items:
              $ref: '#/components/schemas/ValueWithTimestamp'
          description: >-
            Un objet contenant des noms de propriétés mappés à des tableaux de
            leurs valeurs historiques, chacune représentée par un objet
            ValueWithTimestamp.
        updatedAt:
          type: string
          description: >-
            La date et l'heure de la dernière mise à jour de cet objet, au
            format ISO 8601.
          format: date-time
        url:
          type: string
          description: Chaîne représentant l'URL de cet objet.
        warnings:
          type: array
          description: >-
            Un tableau d'avertissements liés à cet objet, chacun représenté par
            un objet PublicObjectWarning.
          items:
            $ref: '#/components/schemas/PublicObjectWarning'
      description: Représente un objet CRM qui a été créé ou mis à jour (upserted)
    StandardError:
      required:
        - category
        - context
        - errors
        - links
        - message
        - status
      type: object
      properties:
        category:
          type: string
          description: Une chaîne spécifiant la catégorie de l'erreur.
        context:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
          description: >-
            Un objet contenant un contexte supplémentaire sur l'erreur, où
            chaque clé est un nom de contexte et la valeur est un tableau de
            chaînes de caractères.
        errors:
          type: array
          description: >-
            Un tableau d'objets ErrorDetail, chacun fournissant des informations
            supplémentaires sur l'erreur.
          items:
            $ref: '#/components/schemas/ErrorDetail'
        id:
          type: string
          description: Une chaîne représentant l'identifiant unique de l'erreur.
        links:
          type: object
          additionalProperties:
            type: string
          description: >-
            Un objet associant des noms de liens à des URI connexes qui
            contiennent de la documentation sur l'erreur ou des étapes de
            remédiation recommandées pour celle-ci.
        message:
          type: string
          description: Message lisible par l'être humain décrivant l'erreur.
        status:
          type: string
          description: Une chaîne indiquant le statut de l'erreur.
        subCategory:
          type: object
          properties: {}
          description: >-
            Un objet fournissant des détails plus spécifiques sur la catégorie
            d'erreur.
      description: >-
        Représente une réponse aux erreurs standard dans l'API HubSpot,
        fournissant des informations détaillées sur une erreur survenue lors
        d'une requête API.
    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
      description: >-
        Représente une réponse d'erreur renvoyée par l'API lorsqu'une opération
        échoue. Ce composant est utilisé dans divers points de terminaison pour
        fournir des informations détaillées sur l'erreur rencontrée.
      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
    ValueWithTimestamp:
      required:
        - sourceType
        - timestamp
        - value
      type: object
      properties:
        sourceId:
          type: string
          description: >-
            Une chaîne représentant l'identifiant de la source à partir de
            laquelle la valeur a été obtenue.
        sourceLabel:
          type: string
          description: >-
            Une chaîne fournissant une étiquette ou un nom pour la source de la
            valeur.
        sourceType:
          type: string
          description: >-
            Une chaîne spécifiant le type de source à partir de laquelle la
            valeur a été obtenue.
        timestamp:
          type: string
          description: >-
            Une chaîne au format date-heure indiquant quand la valeur a été
            enregistrée.
          format: date-time
        updatedByUserId:
          type: integer
          description: >-
            Un nombre entier représentant l'ID de l'utilisateur ayant mis à jour
            la valeur pour la dernière fois.
          format: int32
        value:
          type: string
          description: >-
            Une chaîne représentant la valeur de la propriété à l'horodatage
            donné.
      description: Modèle de propriété qui inclut un horodatage.
    PublicObjectWarning:
      required:
        - category
        - context
        - message
      type: object
      properties:
        category:
          type: string
          description: Chaîne représentant la catégorie de l'avertissement.
        context:
          type: object
          additionalProperties:
            type: string
          description: >-
            Un objet fournissant un contexte supplémentaire sur l'avertissement,
            avec des propriétés de chaîne.
        message:
          type: string
          description: Chaîne contenant le message d'avertissement.
      description: >-
        Représente un message d'avertissement lié à un objet public dans
        HubSpot, fournissant des détails sur la nature et le contexte de
        l'avertissement.
    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é détectée.
            Il s'agit d'une propriété de type chaîne de caractères.
        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
      description: >-
        Représente des informations détaillées sur une erreur survenue dans
        l'API. Ce composant est utilisé pour fournir un contexte et des
        spécificités supplémentaires sur les erreurs, généralement dans le cadre
        d'une réponse d'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:
            crm.objects.appointments.read: ''
            crm.objects.appointments.sensitive.read.v2: ''
            crm.objects.appointments.sensitive.write.v2: ''
            crm.objects.appointments.write: ''
            crm.objects.calls.read: ''
            crm.objects.carts.read: ''
            crm.objects.carts.write: ''
            crm.objects.commercepayments.read: ''
            crm.objects.commercepayments.write: ''
            crm.objects.companies.highly_sensitive.read.v2: ''
            crm.objects.companies.highly_sensitive.write.v2: ''
            crm.objects.companies.read: ''
            crm.objects.companies.sensitive.read.v2: ''
            crm.objects.companies.sensitive.write.v2: ''
            crm.objects.companies.write: ''
            crm.objects.contacts.highly_sensitive.read.v2: ''
            crm.objects.contacts.highly_sensitive.write.v2: ''
            crm.objects.contacts.read: ''
            crm.objects.contacts.sensitive.read.v2: ''
            crm.objects.contacts.sensitive.write.v2: ''
            crm.objects.contacts.write: ''
            crm.objects.courses.read: ''
            crm.objects.courses.write: ''
            crm.objects.custom.highly_sensitive.read.v2: ''
            crm.objects.custom.highly_sensitive.write.v2: ''
            crm.objects.custom.read: ''
            crm.objects.custom.sensitive.read.v2: ''
            crm.objects.custom.sensitive.write.v2: ''
            crm.objects.custom.write: ''
            crm.objects.deals.highly_sensitive.read.v2: ''
            crm.objects.deals.highly_sensitive.write.v2: ''
            crm.objects.deals.read: ''
            crm.objects.deals.sensitive.read.v2: ''
            crm.objects.deals.sensitive.write.v2: ''
            crm.objects.deals.write: ''
            crm.objects.emails.read: ''
            crm.objects.feedback_submissions.read: ''
            crm.objects.goals.read: ''
            crm.objects.goals.write: ''
            crm.objects.invoices.read: ''
            crm.objects.invoices.write: ''
            crm.objects.leads.read: ''
            crm.objects.leads.write: ''
            crm.objects.line_items.read: ''
            crm.objects.line_items.write: ''
            crm.objects.listings.read: ''
            crm.objects.listings.write: ''
            crm.objects.meetings.read: ''
            crm.objects.notes.read: ''
            crm.objects.orders.read: ''
            crm.objects.orders.write: ''
            crm.objects.partner-clients.read: ''
            crm.objects.partner-clients.write: ''
            crm.objects.partner-services.read: ''
            crm.objects.partner-services.write: ''
            crm.objects.products.read: ''
            crm.objects.products.write: ''
            crm.objects.projects.highly_sensitive.read: ''
            crm.objects.projects.highly_sensitive.write: ''
            crm.objects.projects.read: ''
            crm.objects.projects.sensitive.read: ''
            crm.objects.projects.sensitive.write: ''
            crm.objects.projects.write: ''
            crm.objects.quotes.read: ''
            crm.objects.quotes.write: ''
            crm.objects.services.read: ''
            crm.objects.services.write: ''
            crm.objects.subscriptions.read: ''
            crm.objects.subscriptions.write: ''
            crm.objects.tasks.read: ''
            crm.objects.tickets.highly_sensitive.read: ''
            crm.objects.tickets.highly_sensitive.write: ''
            crm.objects.tickets.sensitive.read: ''
            crm.objects.tickets.sensitive.write: ''
            crm.objects.users.read: ''
            crm.objects.users.write: ''
            e-commerce: ''
            media_bridge.read: ''
            tickets.highly_sensitive.v2: ''
            tickets.sensitive.v2: ''

````