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

# File a discrepancy report (Beta)

> **Beta.** Germany only for now; more countries are coming. The request and response shapes may change. Available on accounts with access to the beta; contact support@topograph.co to request it.

Reports a discrepancy between a beneficial-ownership register and the beneficial owners you identified, filed immediately under your own register account. Send the owners in the same shape as `ultimateBeneficialOwners` in the company response; the exact text filed is returned in `filing.text`. The filing completes asynchronously: poll `GET /v2/discrepancy-reports/{id}` or listen for the `discrepancy_report.updated` webhook.



## OpenAPI

````yaml post /v2/discrepancy-reports
openapi: 3.0.0
info:
  title: Topograph
  description: The Topograph API
  version: '0.1'
  contact: {}
servers:
  - url: https://api.topograph.co
security:
  - x-api-key: []
tags: []
paths:
  /v2/discrepancy-reports:
    post:
      tags:
        - Discrepancy reports (Beta)
      summary: File a discrepancy report (Beta)
      description: >-
        **Beta.** Germany only for now; more countries are coming. The request
        and response shapes may change. Available on accounts with access to the
        beta; contact support@topograph.co to request it.


        Reports a discrepancy between a beneficial-ownership register and the
        beneficial owners you identified, filed immediately under your own
        register account. Send the owners in the same shape as
        `ultimateBeneficialOwners` in the company response; the exact text filed
        is returned in `filing.text`. The filing completes asynchronously: poll
        `GET /v2/discrepancy-reports/{id}` or listen for the
        `discrepancy_report.updated` webhook.
      operationId: DiscrepancyReportsController_create_v2
      parameters:
        - name: x-topograph-workspace-id
          in: header
          description: >-
            Workspace whose register credentials file the report. Defaults to
            the default workspace.
          required: false
          schema:
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            Unique key for this report (a UUID is recommended). Resending the
            same body with the same key returns the original report (200) and
            files nothing new; a different body with a used key is refused
            (409).
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateDiscrepancyReportDto'
      responses:
        '200':
          description: Replay of an earlier request with the same Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DiscrepancyReportDto'
        '201':
          description: Report accepted and being filed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DiscrepancyReportDto'
        '400':
          description: >-
            `invalid_request`: missing Idempotency-Key, unsupported country,
            reason or evidence, or explanation too long
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: invalid_request
                      message:
                        type: string
                        example: >-
                          Discrepancy reports are not available for FR yet.
                          Supported: DE.
                      retryable:
                        example: false
                        type: boolean
        '403':
          description: '`feature_not_enabled`: the beta is not enabled on this account'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: feature_not_enabled
                      message:
                        type: string
                        example: >-
                          Discrepancy reports are in beta and not enabled on
                          this account.
                      retryable:
                        example: false
                        type: boolean
        '409':
          description: >-
            `invalid_request`: the Idempotency-Key was already used for a
            different body
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: invalid_request
                      message:
                        type: string
                        example: >-
                          This Idempotency-Key was already used for a different
                          report.
                      retryable:
                        example: false
                        type: boolean
        '428':
          description: >-
            `account_configuration_required`: no register credentials stored for
            this workspace
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: account_configuration_required
                      message:
                        type: string
                        example: >-
                          Reports are filed under your own Transparenzregister
                          account.
                      retryable:
                        example: false
                        type: boolean
        '429':
          description: '`quota_exceeded`: the subscription''s monthly allowance is used up'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: quota_exceeded
                      message:
                        type: string
                        example: >-
                          Your subscription allows 50 discrepancy reports per
                          period, and they are used up.
                      retryable:
                        example: false
                        type: boolean
      security:
        - x-api-key: []
components:
  schemas:
    CreateDiscrepancyReportDto:
      type: object
      properties:
        countryCode:
          type: string
          description: >-
            Country of the company. Supported during the beta: Germany (`DE`);
            more countries are coming.
          enum:
            - AT
            - BE
            - BG
            - CH
            - CN
            - CZ
            - CY
            - DE
            - DK
            - EE
            - ES
            - FI
            - FR
            - GB
            - GG
            - GR
            - HK
            - HR
            - HU
            - IE
            - IS
            - IT
            - JE
            - LI
            - LU
            - LV
            - MC
            - MT
            - MU
            - NL
            - 'NO'
            - PL
            - PT
            - RO
            - RU
            - SE
            - SG
            - SI
            - SK
            - VG
            - PA
            - MX
            - CO
            - EC
            - BM
            - AR
            - AU
            - AG
            - BA
            - BR
            - GI
            - IM
            - KY
            - US-FL
            - US-CO
            - US-IL
            - US-MA
            - US-MD
            - US-MI
            - US-TX
            - US-DE
            - UA
            - US-NY
            - US-NJ
            - US-NM
            - US-OH
            - US-WA
            - US-TN
            - US-GA
            - US-MN
            - US-MO
            - US-NV
            - RS
            - US-PA
            - US-WY
            - US-CT
            - US-UT
            - US-IA
            - US-ID
            - US-AZ
            - US-VA
            - US-MS
            - US-CA
            - US-OR
            - US-KY
            - US-NE
            - US-NC
            - US-AR
            - US-WI
            - US-SC
            - US-AL
            - US-AK
            - US-DC
            - US-IN
            - US-ME
            - US-MT
            - US-OK
            - US-SD
            - US-LA
            - US-WV
            - US-ND
            - US-VT
            - US-KS
            - US-RI
            - US-HI
            - LT
            - MD
            - MH
            - US-NH
            - CA-FED
            - CA-ON
            - CA-QC
            - CA-BC
            - CA-AB
            - CA-MB
            - CA-SK
            - CA-NS
            - CA-NL
            - CA-PE
            - CA-YT
            - CA-NT
            - NC
            - PF
            - NZ
          example: DE
        companyId:
          type: string
          description: The company ID, as used by `POST /v2/company`
          example: München HRB 228960
        reasons:
          type: array
          description: >-
            Why the register is wrong. `incorrect_or_incomplete_information`:
            details of a registered beneficial owner are wrong or incomplete.
            `different_beneficial_owners`: you identified different beneficial
            owners. More values may be added; tolerate unknown ones.
          items:
            type: string
            enum:
              - incorrect_or_incomplete_information
              - different_beneficial_owners
          example:
            - incorrect_or_incomplete_information
        ultimateBeneficialOwners:
          description: >-
            The beneficial owners as you believe the register should list them,
            in the same shape as `ultimateBeneficialOwners` in the company
            response. The filed explanation is written from these facts only.
          type: array
          items:
            $ref: '#/components/schemas/DiscrepancyReportOwnerDto'
        evidence:
          description: Evidence the report relies on
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportEvidenceDto'
        comment:
          type: string
          description: >-
            Free text appended to the generated explanation, in the register's
            language (German for Germany). The whole explanation must fit the
            register's limit (1,000 characters in Germany).
          example: >-
            Die Beteiligung wurde im Rahmen unserer Sorgfaltspflichten
            festgestellt.
        attestation:
          description: Your attestation; the report is filed on acceptance
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportAttestationDto'
        sourceRequestId:
          type: string
          description: >-
            The `requestId` of the company request that showed the register data
            you are disputing, if any
          example: 4f1c3a0e-8b9d-4d6e-a1f2-3c4d5e6f7a8b
        metadata:
          type: object
          additionalProperties:
            type: string
            maxLength: 500
          example:
            caseId: case-12345
          description: >-
            Arbitrary key-value string pairs echoed back in responses and in
            every discrepancy_report.updated webhook. Limits: max 50 keys, keys
            up to 40 chars (longer keys are skipped), values up to 500 chars
            (longer values are truncated).
      required:
        - countryCode
        - companyId
        - reasons
        - ultimateBeneficialOwners
        - evidence
        - attestation
    DiscrepancyReportDto:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the report
          example: 0b7e8a3c-5d2f-4c1e-9a6b-7f8e9d0c1b2a
        status:
          description: >-
            `in_progress`: accepted and being filed. `succeeded`: filed with the
            register; `filing.registerReference` and `filing.receipt` are set.
            `failed`: nothing was filed; see `error`, then correct and resend
            with a new `Idempotency-Key`.
          example: succeeded
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportStatus'
        countryCode:
          type: string
          description: Country of the company
          example: DE
        companyId:
          type: string
          description: The company ID
          example: München HRB 228960
        register:
          description: The register the report is filed with
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportRegisterDto'
        reasons:
          type: array
          description: Why the register is wrong, as sent
          items:
            type: string
            enum:
              - incorrect_or_incomplete_information
              - different_beneficial_owners
          example:
            - incorrect_or_incomplete_information
        ultimateBeneficialOwners:
          description: The beneficial owners, as sent
          type: array
          items:
            $ref: '#/components/schemas/DiscrepancyReportOwnerDto'
        evidence:
          description: Evidence the report relies on, as sent
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportEvidenceDto'
        comment:
          type: string
          description: Free text appended to the explanation, as sent
        filing:
          description: What was filed, and the register acknowledgement
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportFilingDto'
        error:
          description: Why the report failed. Present only when `status` is `failed`.
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportErrorDto'
        sourceRequestId:
          type: string
          description: The company request the report refers to, as sent
        metadata:
          type: object
          additionalProperties:
            type: string
          example:
            caseId: case-12345
          description: Key-value pairs provided at creation
        createdAt:
          type: string
          description: Creation time (ISO 8601)
          example: '2026-10-27T14:10:02.000Z'
        updatedAt:
          type: string
          description: Last update time (ISO 8601)
          example: '2026-10-27T14:12:46.000Z'
      required:
        - id
        - status
        - countryCode
        - companyId
        - register
        - reasons
        - ultimateBeneficialOwners
        - evidence
        - filing
        - createdAt
        - updatedAt
    DiscrepancyReportOwnerDto:
      type: object
      properties:
        gender:
          type: string
          description: >-
            Gender of the person. In German it decides the grammatical form of
            the filed text.
          enum:
            - Male
            - Female
            - Other
            - PreferNotToSay
          example: Male
        name:
          description: Name of the person
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportOwnerNameDto'
        birthDate:
          description: Birth date; partial dates (year only, year and month) are accepted
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportOwnerBirthDateDto'
        nationality:
          type: string
          description: Nationality (ISO 3166-1 alpha-2)
          example: DE
        residenceAddress:
          description: Residence of the person
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportOwnerAddressDto'
        control:
          description: How the person owns or controls the company
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportControlDto'
      required:
        - name
    DiscrepancyReportEvidenceDto:
      type: object
      properties:
        type:
          description: >-
            What the report relies on. `public_register_reference`: the
            discrepancy can be established from public registers (in Germany, §
            22 GwG). Other evidence types, such as uploaded documents, will be
            added.
          example: public_register_reference
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportEvidenceType'
      required:
        - type
    DiscrepancyReportAttestationDto:
      type: object
      properties:
        accepted:
          type: boolean
          description: >-
            Must be `true`. By sending it you confirm, as the register requires
            of every reporter, that you compared the register entry with the
            information you hold, that you determined the beneficial owners as
            the law requires, and that you are entitled to report. The report is
            filed as soon as it is accepted.
          example: true
      required:
        - accepted
    DiscrepancyReportStatus:
      type: string
      enum:
        - in_progress
        - succeeded
        - failed
      description: >-
        `in_progress`: accepted and being filed. `succeeded`: filed with the
        register; `filing.registerReference` and `filing.receipt` are set.
        `failed`: nothing was filed; see `error`, then correct and resend with a
        new `Idempotency-Key`.
    DiscrepancyReportRegisterDto:
      type: object
      properties:
        name:
          type: string
          description: Name of the register the report is filed with
          example: Transparenzregister
      required:
        - name
    DiscrepancyReportFilingDto:
      type: object
      properties:
        language:
          type: string
          description: >-
            Language of the filed explanation (ISO 639-1), the register's
            language
          example: de
        text:
          type: string
          description: >-
            The exact explanation filed with the register, generated from
            `ultimateBeneficialOwners` and `comment`. Available from the moment
            the report is accepted.
          example: Die wirtschaftlich Berechtigte ist Erika Mustermann mit 100 %.
        registerReference:
          type: string
          description: >-
            The register's own reference for the report. Present once the report
            is filed.
          example: '261000000001'
        submittedAt:
          type: string
          description: >-
            When the register received the report (ISO 8601). Present once the
            report is filed.
          example: '2026-10-27T14:11:47.000Z'
        receipt:
          description: >-
            The register's acknowledgement of receipt. Present once the report
            is filed and the receipt collected.
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportReceiptDto'
      required:
        - language
        - text
    DiscrepancyReportErrorDto:
      type: object
      properties:
        code:
          type: string
          description: Public error code
          example: resource_not_found
        message:
          type: string
          description: Human-readable explanation
          example: Resource not found
      required:
        - code
        - message
    DiscrepancyReportOwnerNameDto:
      type: object
      properties:
        fullName:
          type: string
          description: Full name of the person, as it should appear in the register
          example: Erika Mustermann
        title:
          type: string
          description: Title of the person (e.g. Dr.)
        firstName:
          type: string
          description: First name of the person
          example: Erika
        middleName:
          type: string
          description: Middle name of the person
        lastName:
          type: string
          description: Last name of the person
          example: Mustermann
        suffix:
          type: string
          description: Suffix of the name (e.g. Jr.)
      required:
        - fullName
    DiscrepancyReportOwnerBirthDateDto:
      type: object
      properties:
        day:
          type: number
          description: Day of birth (1-31)
          example: 15
        month:
          type: number
          description: Month of birth (1-12), where January is 1
          example: 7
        year:
          type: number
          description: Year of birth
          example: 1980
    DiscrepancyReportOwnerAddressDto:
      type: object
      properties:
        city:
          type: string
          description: City of residence
          example: Berlin
        countryCode:
          type: string
          description: Country of residence (ISO 3166-1 alpha-2)
          example: DE
    DiscrepancyReportControlDto:
      type: object
      properties:
        types:
          type: array
          description: Types of control held by the beneficial owner
          items:
            type: string
            enum:
              - ownership-of-shares
              - voting-rights
              - appoint-and-remove-directors
              - significant-influence-or-control
          example:
            - ownership-of-shares
        details:
          description: >-
            Percentages of control. Never invented: send only what you
            established.
          type: array
          items:
            $ref: '#/components/schemas/DiscrepancyReportPercentageDetailDto'
      required:
        - types
    DiscrepancyReportEvidenceType:
      type: string
      enum:
        - public_register_reference
      description: >-
        What the report relies on. `public_register_reference`: the discrepancy
        can be established from public registers (in Germany, § 22 GwG). Other
        evidence types, such as uploaded documents, will be added.
    DiscrepancyReportReceiptDto:
      type: object
      properties:
        url:
          type: string
          description: >-
            Signed download link to the register receipt (PDF). It expires after
            15 minutes; fetch the report again for a fresh link. Topograph keeps
            the receipt, so it stays available after the register stops serving
            it.
          example: >-
            https://storage.topograph.co/documents/discrepancy-reports/receipt.pdf?sv=...
        expiresAt:
          type: string
          description: When `url` expires (ISO 8601)
          example: '2026-10-27T14:27:47.000Z'
        sha256:
          type: string
          description: >-
            SHA-256 of the receipt, to prove later that a stored copy is the one
            received
          example: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
      required:
        - url
        - expiresAt
        - sha256
    DiscrepancyReportPercentageDetailDto:
      type: object
      properties:
        type:
          type: string
          description: What the percentage measures
          enum:
            - shares
            - voting-rights
          example: shares
        percentageValue:
          type: number
          description: Exact percentage
          example: 100
        percentageRange:
          description: >-
            Range, when only bounds are known. Ignored when `percentageValue` is
            set.
          allOf:
            - $ref: '#/components/schemas/DiscrepancyReportPercentageRangeDto'
        nature:
          type: string
          description: >-
            Whether the control is direct or indirect. Omit or send `null` when
            unknown.
          enum:
            - direct
            - indirect
            - null
          nullable: true
      required:
        - type
    DiscrepancyReportPercentageRangeDto:
      type: object
      properties:
        lower:
          type: number
          description: Lower bound of the range
          example: 25
        upper:
          type: number
          description: Upper bound of the range
          example: 50
      required:
        - lower
        - upper
  securitySchemes:
    x-api-key:
      type: apiKey
      in: header
      name: x-api-key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.