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

# Get LCA results

> Returns the computed LCA for the instance, one entry per reportable
production year — see `LcaResults.results` for which years those are, and
why an instance can legitimately have none.
The instance is modelled with the default scenario for its material
type, not with the scenario of any catalog product it is linked to.
Each year carries characterized results under EN 15804+A2 and ISO 21930 —
impacts per life-cycle module (A1–A3, A4, A5, C1–C4, D, …), a per-source
breakdown, biogenic carbon content, and the background-data provenance.

`job` reports the state of the last `lca-update`, and is the only thing
that says whether to keep polling: while it is `queued` or `processing`
the results are mid-replacement and `results` comes back empty, but an
empty `results` on its own does not imply a job is running. A year that
cannot be computed lists everything standing in the way under
`blocked_by`.




## OpenAPI

````yaml GET /v2/product-instances/{id}/lca-results
openapi: 3.1.0
info:
  title: Emidat API
  version: '2.0'
  description: >
    The Emidat API v2 lets manufacturers create products and supplier products

    programmatically — designed for ERP and system integrations.


    Authentication uses a simple API key (`X-API-Key` header). Keys are issued

    per manufacturer and managed in the Emidat dashboard.


    Keys follow the format `emidat-{key_id}-{secret}`, where `key_id` is a

    random public handle.


    **Onboarding steps** — performed once before creating products:

    - Plant and production process setup (via Emidat UI)

    - Your material codes → Emidat material types and plant codes → Emidat
    plants are mapped in your integration middleware during setup; at runtime
    you send your own codes and the middleware resolves them

    - Create supplier companies via `POST /v2/supplier-companies` — every
    supplier plant needs one, as `supplier_company_id` is required

    - Create supplier plants via `POST /v2/supplier-plants`, referencing a
    supplier company by its Emidat `id`

    - Create supplier products using your own `external_id`; reference them in a
    product's BOM by their Emidat `id` (from the create response, or resolved
    via `GET …?external_id=`)

    - (Optional) Create silos to merge same-type supplier products from
    different suppliers — reference by their Emidat `id` in a product's BOM


    **Preview endpoints** — the `Product Instances` and `Prechain Products` tags

    are in preview. They are live and supported, but their contract is not
    frozen:

    request and response shapes, field names, and error codes may still change
    in

    ways that break existing integrations, possibly without a deprecation
    period.
servers:
  - url: https://api.emidat.com
    description: Production
security:
  - ApiKeyAuth: []
paths:
  /v2/product-instances/{id}/lca-results:
    get:
      tags:
        - Product Instances
      summary: Get LCA results
      description: >
        Returns the computed LCA for the instance, one entry per reportable

        production year — see `LcaResults.results` for which years those are,
        and

        why an instance can legitimately have none.

        The instance is modelled with the default scenario for its material

        type, not with the scenario of any catalog product it is linked to.

        Each year carries characterized results under EN 15804+A2 and ISO 21930
        —

        impacts per life-cycle module (A1–A3, A4, A5, C1–C4, D, …), a per-source

        breakdown, biogenic carbon content, and the background-data provenance.


        `job` reports the state of the last `lca-update`, and is the only thing

        that says whether to keep polling: while it is `queued` or `processing`

        the results are mid-replacement and `results` comes back empty, but an

        empty `results` on its own does not imply a job is running. A year that

        cannot be computed lists everything standing in the way under

        `blocked_by`.
      operationId: v2_product_instances_get_lca_results
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: The instance's Emidat UUID.
      responses:
        '200':
          description: LCA results.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LcaResults'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Product instance not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          $ref: '#/components/responses/MalformedPathId'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '502':
          $ref: '#/components/responses/BadGateway'
components:
  schemas:
    LcaResults:
      type: object
      description: >-
        LCA results for a product instance, one entry per reportable production
        year.
      required:
        - product_instance_id
        - job
        - results
      properties:
        product_instance_id:
          type: string
          format: uuid
        job:
          $ref: '#/components/schemas/LcaRecomputeJob'
        results:
          type: array
          description: |
            One entry per **reportable** production year, ascending.

            Reportable years run from `produced_from` to `produced_to`. An
            open-ended instance (`produced_to: null`) is instead capped at the
            last year production data can be entered for — the current calendar
            year.

            Two consequences worth handling explicitly:

            - The current calendar year is reportable as soon as its production
              data is entered. Because the year is not over, that result covers
              only the part of the year entered so far.
            - Years lying in a **future** calendar year *are* listed when an
              explicit `produced_to` covers them, but stay blocked by a
              `missing_input` blocker of kind `production_data` until that year
              arrives and its production data is entered. They are not pending
              computation.

            Do not read emptiness as "a job is running": while `job.status` is
            `queued` or `processing` this array is emptied because the stored
            results are mid-replacement, but it is equally empty when there is
            nothing to report. **`job.status` is the only signal for whether to
            keep polling** — poll while it is `queued` or `processing`, and stop
            once it reaches `completed`, `failed`, or `idle`, whatever `results`
            holds.
          items:
            $ref: '#/components/schemas/YearLcaResult'
    Error:
      type: object
      required:
        - msg
        - err_code
      properties:
        msg:
          type: string
          description: Human-readable explanation, for logs and operators. Do not parse it.
          example: supplier product requires a supplier plant
        err_code:
          type: string
          description: >
            Stable, machine-readable error code — branch on this, never on
            `msg`.

            The set may grow over time; treat an unrecognized code as

            non-retryable and surface it to an operator. The enum lists every

            code the platform can emit; only a subset is reachable per

            endpoint — see [Errors](/errors) for the actionable catalog.


            `LcaRecomputeJob.err_code` reports failures from this same `err_*`

            namespace. `LcaBlocker.err_code` does not — those values are a

            separate, disjoint set.
          example: err_supplier_product_missing_supplier_plant
          enum:
            - err_not_defined
            - err_not_found
            - err_not_valid
            - err_not_authenticated
            - err_permission_denied
            - err_declaration_not_completed
            - err_declaration_not_regenerable
            - err_epd_document_already_exists
            - err_invalid_product_ids
            - err_generate_products_limit
            - err_plant_missing_product_category
            - err_plant_incomplete_address
            - err_plant_incomplete_company_fields
            - err_plant_categories_not_covering_processes
            - err_plant_categories_not_covering_active_products
            - err_plant_invalid_category_id
            - err_plant_custom_electricity_mix_not_allowed
            - err_plant_electricity_mix_mismatch
            - err_plant_negative_electricity_values
            - err_plant_electricity_without_mix
            - err_electricity_plant_production_mismatch
            - err_lca_mass_balance
            - err_lca_allocation_data_incomplete
            - err_lca_production_output_mismatch
            - err_product_mass_larger_than_recipe_mass
            - err_product_category_not_allowed_at_plant
            - err_water_not_scoped_but_wastewater_is_scoped
            - err_more_wastewater_than_water
            - err_project_no_products
            - err_invalid_product_quantity
            - err_duplicate_product
            - err_product_missing_gwp_total
            - err_elementary_deactivated
            - err_product_missing_supplier
            - err_epd_unusable
            - err_epd_service
            - err_lca_update_not_queued
            - err_not_ready_for_epd
            - err_material_not_hazardous
            - err_material_no_limited_lifetime
            - err_invalid_lifetime_years
            - err_invalid_secondary_percentage_range
            - err_secondary_percentage_not_customizable
            - err_moisture_content_not_bio_based
            - err_invalid_moisture_content_range
            - err_declaration_not_exists
            - err_declaration_not_under_review
            - err_no_manufacturer
            - err_wrong_email_domain
            - err_user_exists
            - err_inviter_email_not_found
            - err_composite_used_in_supplier_products
            - err_composite_name_exists
            - err_plant_io_invalid_field
            - err_plant_io_field_not_switchable
            - err_plant_io_value_not_scoped
            - err_field_is_plant_level
            - err_negative_io_value
            - err_plant_io_mixed_allocation_groups
            - err_inies_sworn_statement_exists
            - err_supplier_in_use
            - err_supplier_name_exists
            - err_supplier_plant_in_use
            - err_supplier_plant_name_exists
            - err_supplier_product_in_recipe
            - err_supplier_product_in_silo
            - err_supplier_product_missing_supplier_plant
            - err_silo_in_use
            - err_silo_name_exists
            - err_elementary_unknown_matching
            - err_product_document_not_deletable
            - err_product_has_declarations
            - err_product_instance_in_recipe
            - err_prechain_product_in_recipe
            - err_prechain_product_exists
            - err_ccf_exists
            - err_ccf_not_completed
            - err_external_id_exists
            - err_bulk_upload_invalid_file
            - err_material_type_not_found
            - err_material_type_not_configured
            - err_unit_not_allowed_for_material
            - err_production_process_not_found
            - err_multiple_production_processes
            - err_process_plant_mismatch
            - err_material_process_incompatible
            - err_composite_not_allowed_in_recipe
            - err_elementary_not_allowed_in_recipe
            - err_prechain_circular_reference
            - err_product_type_no_recipe
            - err_product_mass_not_set
            - err_required_cell_empty
            - err_plant_not_found
            - err_plant_no_access
            - err_multiple_plants
            - err_product_already_exists
            - err_multiple_products
            - err_linked_product_type_mismatch
            - err_tech_spec_not_recognized
            - err_recipe_incomplete
            - err_orphan_row
            - err_duplicate_tech_spec
            - err_empty_sheet
            - err_no_products
            - err_tech_spec_invalid_value
            - err_dtp_service
            - err_data_translation_wrong_step
            - err_data_translation_invalid_plant_mapping
            - err_data_translation_unresolved_reference
            - err_data_translation_incomplete
            - err_data_translation_material_not_available
            - err_recycled_content_proof_missing
            - err_ppwr_declaration_exists
            - err_ppwr_declaration_editable_exists
            - err_ppwr_declaration_frozen
            - err_ppwr_doc_number_unavailable
            - err_ppwr_variant_mass_invalid
            - err_ppwr_variant_dimension_invalid
            - err_ppwr_variant_material_repeated
            - err_ppwr_variant_material_type
            - err_ppwr_invalid_field_key
            - err_ppwr_supplier_request_not_packaging_manufacturer
            - err_ppwr_supplier_request_pending
            - err_ppwr_supplier_request_not_pending
            - err_ppwr_field_not_requested
            - err_ppwr_document_limit_reached
            - err_ppwr_generation_not_packaging_manufacturer
            - err_ppwr_declaration_incomplete
            - err_ppwr_invalid_signatory
            - err_ppwr_invitation_send_failed
            - err_ppwr_supplier_link_placeholder_missing
            - err_ppwr_supplier_subject_missing
            - err_ppwr_supplier_email_missing
            - err_ppwr_verification_code_limit
            - err_ppwr_verification_code_send_failed
            - err_ppwr_email_not_verified
            - err_ppwr_attestation_required
            - err_ppwr_document_not_deletable
            - err_proof_document_limit
            - err_proof_size_limit
            - err_transport_route_unavailable
            - err_transport_missing_coordinates
            - err_transport_no_route
            - err_transport_same_address
            - err_reauthentication_required
            - err_two_factor_required
    LcaRecomputeJob:
      type: object
      description: >
        State of the recompute triggered by `POST
        /v2/product-instances/{id}/lca-update`.

        Recompute runs in the background, so this is how you tell finished

        results from in-flight ones.
      required:
        - status
        - err_code
      properties:
        status:
          type: string
          enum:
            - idle
            - queued
            - processing
            - completed
            - failed
          description: >
            `idle` — no recompute has been requested since the last one expired.

            `queued`/`processing` — a recompute is in flight; results are
            withheld

            until it finishes. `completed` — the last recompute succeeded.

            `failed` — it did not; see `err_code`.
          example: queued
        err_code:
          anyOf:
            - type: string
            - type: 'null'
          description: |
            Why the last recompute failed, drawn from the same `err_*` namespace
            as `Error.err_code`. Null unless `status` is `failed`.
    YearLcaResult:
      type: object
      required:
        - year
        - blocked_by
        - lca_results
      properties:
        year:
          type: integer
          example: 2025
        blocked_by:
          anyOf:
            - type: array
              items:
                $ref: '#/components/schemas/LcaBlocker'
            - type: 'null'
          description: |
            Everything standing between this year and a computed result. Empty
            when nothing does. Fix each entry — supply the missing input, or
            correct the data it names — and recompute.

            `null` when the year is blocked and the key may not read why: every
            blocker names the recipe, process or production data it is waiting
            on, so the list needs both `view:recipes` and `view:processes`.
        lca_results:
          description: |
            The computed results for this year, or `null` if the year is not
            computable (see `blocked_by`). An empty `blocked_by` with
            `lca_results: null` means the year is computable but has not been
            computed yet — trigger `lca-update`. A `null` `blocked_by` means
            the year is blocked by something the key may not read.
          anyOf:
            - $ref: '#/components/schemas/LcaResultDetail'
            - type: 'null'
    LcaBlocker:
      description: |
        One reason the year cannot be computed — either an input that is absent
        or data that is present but inconsistent or unusable. Discriminated on
        `err_code`.

        Blocker `err_code` values are their own namespace, disjoint from the
        `err_*` codes of `Error.err_code` and `LcaRecomputeJob.err_code`: a
        blocker describes modelling data you still owe us, not a failed request.
        The full set is the five values below and it will only grow.
      oneOf:
        - $ref: '#/components/schemas/MissingInputBlocker'
        - $ref: '#/components/schemas/ElectricityGuaranteesOfOriginBlocker'
        - $ref: '#/components/schemas/MassBalanceBlocker'
        - $ref: '#/components/schemas/EpdNotUsableBlocker'
        - $ref: '#/components/schemas/ProductionOutputMismatchBlocker'
      discriminator:
        propertyName: err_code
        mapping:
          missing_input:
            $ref: '#/components/schemas/MissingInputBlocker'
          electricity_guarantees_of_origin_mismatch:
            $ref: '#/components/schemas/ElectricityGuaranteesOfOriginBlocker'
          mass_balance:
            $ref: '#/components/schemas/MassBalanceBlocker'
          epd_not_usable:
            $ref: '#/components/schemas/EpdNotUsableBlocker'
          production_output_mismatch:
            $ref: '#/components/schemas/ProductionOutputMismatchBlocker'
    LcaResultDetail:
      type: object
      description: |
        Characterized results under each supported standard, plus the background
        data provenance used for the computation.
      required:
        - en15804a2_result
        - en15804a2_secondary_databases
        - en15804a2_pcrs
        - iso21930_result
        - iso21930_secondary_databases
        - iso21930_pcrs
        - background_database_name
        - background_database_version
        - background_database_system_model
        - created_at
        - updated_at
      properties:
        en15804a2_result:
          $ref: '#/components/schemas/StandardResult'
        en15804a2_secondary_databases:
          type: array
          description: Secondary (background) databases used for the EN 15804+A2 result.
          items:
            type: string
          example:
            - ecoinvent-3.10
        en15804a2_pcrs:
          type: array
          description: Product Category Rules applied for the EN 15804+A2 result.
          items:
            $ref: '#/components/schemas/Pcr'
        iso21930_result:
          $ref: '#/components/schemas/StandardResult'
        iso21930_secondary_databases:
          type: array
          description: Secondary (background) databases used for the ISO 21930 result.
          items:
            type: string
          example:
            - ecoinvent-3.10
        iso21930_pcrs:
          type: array
          description: Product Category Rules applied for the ISO 21930 result.
          items:
            $ref: '#/components/schemas/Pcr'
        background_database_name:
          type: string
          enum:
            - ecoinvent
            - eurobitume
            - ecoinvent-lcia-implementation
            - uslci
          example: ecoinvent
        background_database_version:
          type: string
          example: '3.10'
        background_database_system_model:
          type: string
          enum:
            - EN15804
            - cutoff
          example: EN15804
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    MissingInputBlocker:
      type: object
      description: An input or sub-assembly result the year needs is absent.
      required:
        - err_code
        - kind
        - id
        - name
      properties:
        err_code:
          type: string
          const: missing_input
        kind:
          type: string
          enum:
            - production_data
            - silo_data
            - prechain_results
            - product_mass
            - economic_value
            - production_output
          description: |
            What is missing for the year. `id` and `name` say what the input
            belongs to; for `economic_value` and `production_output` that is a
            product of the same production process, which may be a co-product
            rather than this one.
        id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          description: UUID of the related entity, when applicable.
        name:
          anyOf:
            - type: string
            - type: 'null'
          description: Human-readable name of the missing item, when available.
    ElectricityGuaranteesOfOriginBlocker:
      type: object
      description: |
        Guarantees of origin cover all of the year's electricity, so there is no
        residual grid mix left to model.
      required:
        - err_code
        - year
      properties:
        err_code:
          type: string
          const: electricity_guarantees_of_origin_mismatch
        year:
          type: integer
          example: 2025
    MassBalanceBlocker:
      type: object
      description: The BOM's raw-material mass cannot account for the product's mass.
      required:
        - err_code
        - available_mass_kg
        - product_mass_kg
      properties:
        err_code:
          type: string
          const: mass_balance
        available_mass_kg:
          type: number
          description: Mass available from the BOM, in kg.
        product_mass_kg:
          type: number
          description: Mass the product declares, in kg.
    EpdNotUsableBlocker:
      type: object
      description: A supplier product's linked EPD cannot be used for the LCA.
      required:
        - err_code
        - supplier_product_id
        - epd_id
      properties:
        err_code:
          type: string
          const: epd_not_usable
        supplier_product_id:
          type: string
          format: uuid
        epd_id:
          type: string
          format: uuid
    ProductionOutputMismatchBlocker:
      type: object
      description: |
        The products of the production process differ in price by more than
        25 %, so the process is allocated economically, but their production
        outputs do not add up to the process's production output (more than
        1 % apart).
      required:
        - err_code
        - process_total
        - instances_total
        - unit
      properties:
        err_code:
          type: string
          const: production_output_mismatch
        process_total:
          type: number
          description: Production output entered on the process, in `unit`.
        instances_total:
          type: number
          description: Summed production output of the process's products, in `unit`.
        unit:
          type: string
          enum:
            - M
            - M2
            - M3
            - KG
            - T
            - L
            - KWH
            - MJ
            - UNIT
            - METRIC TON*KM
    StandardResult:
      type: object
      description: |
        Characterized impacts for one standard (e.g. EN 15804+A2 or ISO 21930).
        Indicator names and units differ by standard.
      required:
        - impact_summary
        - impacts_per_source
        - biogenic_carbon_content_kg_c
        - biogenic_carbon_content_packaging_kg_c
      properties:
        impact_summary:
          $ref: '#/components/schemas/ModuleImpacts'
        impacts_per_source:
          anyOf:
            - type: array
              items:
                $ref: '#/components/schemas/ImpactSource'
            - type: 'null'
          description: |
            Per-source contribution breakdown (one entry per raw material /
            packaging). `null` without `view:recipes` — the breakdown names the
            components behind the result — as opposed to `[]`, a result with no
            sources.
        biogenic_carbon_content_kg_c:
          type: number
          description: Biogenic carbon content of the product, in kg C.
          example: 0.494
        biogenic_carbon_content_packaging_kg_c:
          type: number
          description: Biogenic carbon content of the packaging, in kg C.
          example: 0
    Pcr:
      type: object
      description: A Product Category Rule document referenced by the result.
      required:
        - id
        - key
        - name
        - short_name
        - reference_for_bibliography
        - author
        - type
      properties:
        id:
          type: string
          format: uuid
        key:
          type: string
          example: NPCR Part A:2021
        name:
          type: string
          example: NPCR Part A Construction products and services
        short_name:
          type: string
          example: NPCR Part A:2021
        reference_for_bibliography:
          type: array
          items:
            type: string
        author:
          type: string
          example: EPD Global
        type:
          type: string
          enum:
            - Part A
            - cPCR
          description: PCR type.
          example: Part A
    ModuleImpacts:
      type: object
      description: |
        Characterized impacts per life-cycle module (EN 15804 module grid).
        Each module is a list of indicator values, or `null` when the module was
        not assessed (e.g. the use-stage B modules for many products).
      required:
        - a1
        - a2
        - a3
        - a1_a3
        - a4
        - a5
        - b1
        - b2
        - b3
        - b4
        - b5
        - b6
        - b7
        - c1
        - c2
        - c3
        - c4
        - d
      properties:
        a1:
          $ref: '#/components/schemas/IndicatorList'
        a2:
          $ref: '#/components/schemas/IndicatorList'
        a3:
          $ref: '#/components/schemas/IndicatorList'
        a1_a3:
          $ref: '#/components/schemas/IndicatorList'
        a4:
          $ref: '#/components/schemas/IndicatorList'
        a5:
          $ref: '#/components/schemas/IndicatorList'
        b1:
          $ref: '#/components/schemas/IndicatorList'
        b2:
          $ref: '#/components/schemas/IndicatorList'
        b3:
          $ref: '#/components/schemas/IndicatorList'
        b4:
          $ref: '#/components/schemas/IndicatorList'
        b5:
          $ref: '#/components/schemas/IndicatorList'
        b6:
          $ref: '#/components/schemas/IndicatorList'
        b7:
          $ref: '#/components/schemas/IndicatorList'
        c1:
          $ref: '#/components/schemas/IndicatorList'
        c2:
          $ref: '#/components/schemas/IndicatorList'
        c3:
          $ref: '#/components/schemas/IndicatorList'
        c4:
          $ref: '#/components/schemas/IndicatorList'
        d:
          $ref: '#/components/schemas/IndicatorList'
    ImpactSource:
      type: object
      description: >-
        One contributing source (a raw material or its packaging) and its
        impacts.
      required:
        - name
        - impacts_total
        - impacts_transport
        - type
      properties:
        name:
          type: string
          example: Hackschnitzel, TestPlant (Wood chips)
        impacts_total:
          type: array
          description: Total characterized impacts attributed to this source.
          items:
            $ref: '#/components/schemas/Indicator'
        impacts_transport:
          anyOf:
            - type: array
              items:
                $ref: '#/components/schemas/Indicator'
            - type: 'null'
          description: |
            The transport portion of this source's impacts (a subset of the
            total), or `null` where transport is not modelled separately.
        type:
          type: string
          enum:
            - raw_materials
            - packaging
            - energy_and_fuels
            - ancillary_materials
            - waste
            - other
          description: Source category.
          example: raw_materials
    IndicatorList:
      anyOf:
        - type: array
          items:
            $ref: '#/components/schemas/Indicator'
        - type: 'null'
      description: >-
        Indicator values for one module, or `null` if the module was not
        assessed.
    Indicator:
      type: object
      required:
        - indicator_name
        - unit
        - value
      properties:
        indicator_name:
          type: string
          example: GWP-total
        unit:
          type: string
          example: kg CO2-Eq
        value:
          anyOf:
            - type: number
            - type: 'null'
          description: Null when the indicator could not be characterized.
          example: -1.7838794215158404
  responses:
    Unauthorized:
      description: >
        No credentials; or the key is malformed, unknown, revoked, or expired.
        The

        response is uniform and does not reveal which check failed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: >
        A valid key lacked the required permission, or targeted a resource
        outside

        its access.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    MalformedPathId:
      description: Malformed `id` — not a UUID.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    InternalServerError:
      description: An unexpected server error occurred. Surface it to an operator.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadGateway:
      description: A transient upstream dependency failed. Retry with backoff.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: |
        Per-manufacturer API key in the `X-API-Key` header, format
        `emidat-{key_id}-{secret}` where `key_id` is a random public handle.
        Issued by an owner in the Emidat
        dashboard; carries its own permission scopes, optional plant
        restrictions, and optional expiry. A revoked, expired, or unknown key
        returns 401. See the Authentication guide for details.

````