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

# Create an issue report

> Creates a new issue report for property or classified data quality problems, clustering merge or split problems, or other caller-reported issues.



## OpenAPI

````yaml /immoteur-api-public-v1.spec.yaml post /issues
openapi: 3.1.0
info:
  title: Immoteur Public API
  version: 1.1.0
  description: >-
    Public API for the Immoteur service.


    ## Authentication

    Use a **Personal Access Token** from your Immoteur dashboard and send it in
    the `Authorization` header:


    ```

    Authorization: Bearer YOUR_TOKEN_HERE

    ```


    ### cURL example

    ```bash

    curl -sS https://api.immoteur.com/public/v1/auth \
      -H "Authorization: Bearer $IMMOTEUR_TOKEN"
    ```


    ## Environments

    - **Production:** `https://api.immoteur.com/public/v1`


    ## Errors & Rate Limiting

    - `400 Bad Request`: malformed request or invalid syntax.

    - `401 Unauthorized`: missing or invalid token.

    - `403 Forbidden`: token valid but not permitted for this resource.

    - `429 Too Many Requests`: back off and retry with exponential delay.

    - `422 Validation Error`: payload is syntactically correct but fails
    validation.


    ## Pagination

    - Requests specify `page` (1..500). Responses include `page`, `nextPage`,
    `perPage`, `total`, `totalPages`.


    ## Data Access Limits

    The `meta.dataAccessLimit` block shows **implicit filters** tied to your
    plan (e.g., whitelisted departments/SIREN/SIRET). Your effective result set
    equals **your filters ∩ requested filters**.


    ## Using AI/LLMs

    - Always include the `Authorization` header.

    - Prefer explicit filters (departments, INSEE, postcodes) with **existing**
    French codes/names.

    - Follow the examples below as canonical payload shapes.


    ## Contact & Docs

    - Website: https://immoteur.com

    - Support: Use your customer portal or contact listed on the website.
  contact:
    url: https://immoteur.com
    name: Immoteur
    email: support@immoteur.com
servers:
  - url: https://api.immoteur.com/public/v1
    description: Production server
security:
  - BearerAuth: []
tags:
  - name: Info
    description: Token/account info
  - name: Property
    description: Property operations
  - name: Classified
    description: Classified operations
  - name: Issue
    description: User-submitted issue reports
externalDocs:
  description: Full product documentation
  url: https://docs.immoteur.com
paths:
  /issues:
    post:
      tags:
        - Issue
      summary: Create an issue report
      description: >-
        Creates a new issue report for property or classified data quality
        problems, clustering merge or split problems, or other caller-reported
        issues.
      operationId: createIssueReport
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IssueReportWrite'
      responses:
        '201':
          description: Issue report created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IssueReportReceipt'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '409':
          $ref: '#/components/responses/MissConfigurationError'
        '422':
          $ref: '#/components/responses/ValidationError'
        '429':
          $ref: '#/components/responses/RateLimitError'
        default:
          $ref: '#/components/responses/DefaultError'
components:
  schemas:
    IssueReportWrite:
      type: object
      required:
        - issueKind
      description: >-
        Public issue-report request. `issueKind` controls the conditional rules:


        - `data` requires at least one `issueFacets` value and cannot set
        `clusteringAction`

        - `clustering` requires `clusteringAction` and at least two explicit
        targets across `propertyIds` and `classifiedIds`

        - `other` requires a non-blank `comment` and cannot set `issueFacets` or
        `clusteringAction`


        Provide at least one target overall through `propertyIds` or
        `classifiedIds`.
      properties:
        classifiedIds:
          type: array
          uniqueItems: true
          description: Explicit classified targets identified by UUID.
          items:
            type: string
            format: uuid
        clusteringAction:
          $ref: '#/components/schemas/IssueReportClusteringAction'
          description: Required when `issueKind` is `clustering`.
        comment:
          type: string
          maxLength: 4000
          description: >-
            Optional details for `data`, required details for `other`, and
            optional details for `clustering`.
        issueFacets:
          type: array
          minItems: 1
          uniqueItems: true
          description: Required when `issueKind` is `data`.
          items:
            $ref: '#/components/schemas/IssueReportFacet'
        issueKind:
          $ref: '#/components/schemas/IssueReportKind'
        propertyIds:
          type: array
          uniqueItems: true
          description: Explicit property targets identified by UUID.
          items:
            type: string
            format: uuid
      anyOf:
        - required:
            - propertyIds
          properties:
            propertyIds:
              minItems: 1
        - required:
            - classifiedIds
          properties:
            classifiedIds:
              minItems: 1
      allOf:
        - if:
            properties:
              issueKind:
                const: data
          then:
            required:
              - issueFacets
            properties:
              clusteringAction:
                type: 'null'
        - if:
            properties:
              issueKind:
                const: clustering
          then:
            required:
              - clusteringAction
            anyOf:
              - required:
                  - propertyIds
                properties:
                  propertyIds:
                    minItems: 2
              - required:
                  - classifiedIds
                properties:
                  classifiedIds:
                    minItems: 2
              - required:
                  - propertyIds
                  - classifiedIds
                properties:
                  classifiedIds:
                    minItems: 1
                  propertyIds:
                    minItems: 1
        - if:
            properties:
              issueKind:
                const: other
          then:
            required:
              - comment
            properties:
              clusteringAction:
                type: 'null'
              comment:
                pattern: \S
            not:
              required:
                - issueFacets
    IssueReportReceipt:
      type: object
      required:
        - reportId
        - createdAt
      properties:
        createdAt:
          type: string
          format: date-time
          description: Timestamp when the issue report was created.
        reportId:
          type: string
          format: uuid
          description: Identifier of the stored issue report for later support correlation.
    IssueReportClusteringAction:
      type: string
      nullable: true
      enum:
        - merge
        - split
    IssueReportFacet:
      type: string
      enum:
        - attributes
        - contact
        - description
        - link
        - location
        - media
        - other
        - price
        - publisher
        - status
    IssueReportKind:
      type: string
      enum:
        - clustering
        - data
        - other
    ProblemDetails:
      type: object
      required:
        - type
        - title
        - status
        - detail
        - instance
        - code
        - traceId
      properties:
        code:
          type: string
          description: Stable machine-readable error code.
          example: resource_not_found
        detail:
          type: string
          description: Human-readable explanation specific to this occurrence.
          example: The requested resource could not be found.
        instance:
          type: string
          description: Request URI identifying the specific occurrence.
          example: /public/v1/properties/019c12dc-339f-72ce-98db-663b44c0d924
        status:
          type: integer
          format: int32
          minimum: 400
          maximum: 599
          description: HTTP status code generated for this occurrence.
          example: 404
        title:
          type: string
          description: Short, human-readable summary of the problem type.
          example: Resource not found
        traceId:
          type: string
          format: uuid
          description: Trace identifier to correlate client errors with server logs.
          example: b94f4db5-2f5e-4b8f-9dd0-f2fe5c7a7a4f
        type:
          type: string
          format: uri
          description: URI reference identifying the problem type.
          example: https://docs.immoteur.com/problems/resource_not_found
    ValidationProblemDetails:
      type: object
      required:
        - type
        - title
        - status
        - detail
        - instance
        - code
        - traceId
        - violations
      properties:
        code:
          type: string
          description: Stable machine-readable error code.
          example: validation_error
        detail:
          type: string
          description: Human-readable explanation specific to this occurrence.
          example: One or more request fields are invalid.
        instance:
          type: string
          description: Request URI identifying the specific occurrence.
          example: /public/v1/properties/search
        status:
          type: integer
          format: int32
          minimum: 400
          maximum: 599
          description: HTTP status code generated for this occurrence.
          example: 422
        title:
          type: string
          description: Short, human-readable summary of the problem type.
          example: Validation error
        traceId:
          type: string
          format: uuid
          description: Trace identifier to correlate client errors with server logs.
          example: 4bdb0c23-53fc-4d14-a300-c63eb420ec5e
        type:
          type: string
          format: uri
          description: URI reference identifying the problem type.
          example: https://docs.immoteur.com/problems/validation_error
        violations:
          type: array
          description: Per-field validation issues.
          items:
            $ref: '#/components/schemas/ProblemViolation'
    ProblemViolation:
      type: object
      required:
        - field
        - message
        - code
      properties:
        code:
          type: string
          description: Stable machine-readable violation code.
          example: validation
        field:
          type: string
          description: Path or field name that failed validation.
          example: id
        message:
          type: string
          description: Human-readable validation message.
          example: The id field must be a valid UUID.
  responses:
    BadRequestError:
      description: >-
        Bad request — the request could not be understood or was missing
        required information.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    UnauthorizedError:
      description: Authentication required / invalid token
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    ForbiddenError:
      description: Authenticated but not allowed for this resource
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    MissConfigurationError:
      description: Data access (SIREN / SIRET / Department) not configured for example.
      content:
        application/json:
          schema:
            type: object
            required:
              - message
            properties:
              configurationUrl:
                type: string
                format: uri
                example: https://immoteur.com/en/dashboard/billing#data-access
              documentationUrl:
                type: string
                format: uri
                example: https://docs.immoteur.com/pages/en/introduction
              message:
                type: string
                example: Data access (SIREN / SIRET / Department) not configured.
    ValidationError:
      description: Validation error response
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ValidationProblemDetails'
    RateLimitError:
      description: Too many requests. Rate limit headers are returned on all responses.
      headers:
        RateLimit-Policy:
          $ref: '#/components/headers/RateLimitPolicy'
        RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
        Retry-After:
          $ref: '#/components/headers/RateLimitRetryAfter'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    DefaultError:
      description: Undocumented error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
  headers:
    RateLimitPolicy:
      description: Comma-separated policy values ordered as second, minute, day.
      schema:
        type: string
        example: 1;w=1, 20;w=60, 250;w=86400
    RateLimitLimit:
      description: Comma-separated limit values ordered as second, minute, day.
      schema:
        type: string
        example: 1, 20, 250
    RateLimitRemaining:
      description: Comma-separated remaining request counts ordered as second, minute, day.
      schema:
        type: string
        example: 0, 18, 240
    RateLimitReset:
      description: >-
        Comma-separated seconds until the current windows reset (second, minute,
        day).
      schema:
        type: string
        example: 1, 45, 8200
    RateLimitRetryAfter:
      description: Seconds to wait before retrying after a rate limit response.
      schema:
        type: integer
        format: int32
        minimum: 1
        example: 1
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Personal Access Token
      description: |-
        Send your Immoteur Personal Access Token in the `Authorization` header:
        `Authorization: Bearer <token>`

        You can create and manage your Personal Access Tokens here:
        https://immoteur.com/dashboard/settings
                                    status:
                                        current: available

````