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

# Vietnam Manufacturing PMI (S&P Global)

> Monthly S&P Global Vietnam Manufacturing PMI — the headline, seasonally adjusted
index, in index points. 50 means no change from the previous month; above 50 is
expansion, below 50 contraction.

`points` has one entry per month in the window, oldest first; a month without a
reading stays in the list with `value: null` — never 0. `latest` summarises the
newest reading: the change from the previous month in points, the status against
50, and how many consecutive months it has held that status.

S&P Global publishes each month's reading on the first working day of the
following month. Pass `asOf` to get the series as it was known at the end of a
past day (point-in-time, for backtests).

Source: S&P Global.




## OpenAPI

````yaml /openapi.yaml get /openapi/v1/macro/pmi/vn/manufacturing
openapi: 3.1.0
info:
  title: HayInsights Open API
  version: 0.1.0
  description: >
    Programmatic access to the **HayInsights** financial-data hub — commodities,

    crypto, ETF, FX, macroeconomic, real-estate, news, economic-calendar and

    market-index datasets, served from a single API surface under
    `/openapi/v1/*`.


    This specification is the **single source of truth** for the public API

    surface — shared by SDK codegen, the reference docs, and (later) the mock

    server / contract tests.


    ## Authentication


    Every request must carry your API key in the `X-API-Key` header. There is a

    single authentication tier — no request signing. Create and manage keys in

    the HayInsights dashboard (Account → API keys). See **Authentication**.


    ## Plans & quota


    Access to each data domain and your request quota are governed by the

    subscription plan attached to your key. Each endpoint consumes a
    **weighted**

    amount of your per-minute quota; every response carries `X-RateLimit-*`

    headers. See **Rate limits** and **Plans & features**.
  contact: {}
servers:
  - url: https://api-v2.hayinsights.com
    description: Production
security:
  - HayInsightsApiKey: []
tags:
  - name: Commodities
    description: >-
      Spot prices, top movers, gold–DXY correlation and historical series for
      energy, metals and agricultural commodities.
  - name: Crypto
    description: >-
      Crypto market overview, dominance, bubble map, on-chain and derivatives
      metrics.
  - name: ETF
    description: >-
      Exchange-traded fund listings, performance & net-flow rankings, heatmap,
      holdings, NAV growth, fund composition and Bank of Japan ETF holdings.
  - name: FX
    description: >-
      Foreign-exchange summary, live table, 90-day correlation matrix and the
      emerging-market stress monitor.
  - name: Macro
    description: >-
      Macroeconomic indicators — GDP, CPI/PCE, exchange rates, population,
      central-government debt, policy rates / bond yields, interbank rates, FDI,
      trade by region and the manufacturing PMI.
  - name: Real Estate
    description: >-
      Land prices, transaction-level records, administrative geography
      (provinces / wards) and choropleth GeoJSON, by country.
  - name: News
    description: >-
      Market news headlines with per-article sentiment, plus an aggregate
      sentiment reading over a rolling window.
  - name: Calendar
    description: >-
      Economic calendar — rate decisions, CPI and GDP releases, market holidays
      and asset-level events.
  - name: Market
    description: >-
      Index snapshots and global index closes — levels and daily moves for S&P
      500, Nasdaq, Nikkei, VN-Index and others.
  - name: Equities
    description: >-
      Japanese stock detail (Tokyo Stock Exchange) — end-of-day snapshot,
      corporate events, daily prices, financial statements and sector peers.
paths:
  /openapi/v1/macro/pmi/vn/manufacturing:
    get:
      tags:
        - Macro
      summary: Vietnam Manufacturing PMI (S&P Global)
      description: >
        Monthly S&P Global Vietnam Manufacturing PMI — the headline, seasonally
        adjusted

        index, in index points. 50 means no change from the previous month;
        above 50 is

        expansion, below 50 contraction.


        `points` has one entry per month in the window, oldest first; a month
        without a

        reading stays in the list with `value: null` — never 0. `latest`
        summarises the

        newest reading: the change from the previous month in points, the status
        against

        50, and how many consecutive months it has held that status.


        S&P Global publishes each month's reading on the first working day of
        the

        following month. Pass `asOf` to get the series as it was known at the
        end of a

        past day (point-in-time, for backtests).


        Source: S&P Global.
      operationId: macroPmiVnManufacturing
      parameters:
        - name: period
          in: query
          required: false
          description: >
            Window length, counted back from the latest month that has a reading
            (that

            month included). Case-insensitive.


            | Value | Months |

            | --- | --- |

            | `3M` | 3 |

            | `6M` | 6 |

            | `1Y` | 12 |

            | `3Y` | 36 |
          schema:
            type: string
            enum:
              - 3M
              - 6M
              - 1Y
              - 3Y
            default: 1Y
            example: 3M
        - name: asOf
          in: query
          required: false
          description: >
            Point-in-time date (`YYYY-MM-DD`): return only what was known by the
            end of

            that day (UTC), leaving out readings and revisions published later.
            Omit for

            the latest data.
          schema:
            type: string
            format: date
            example: '2026-10-01'
      responses:
        '200':
          description: Monthly PMI series for the requested window.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MacroPmiManufacturingResponse'
              example:
                success: true
                statusCode: 200
                data:
                  country: vn
                  seriesCode: manufacturing_pmi
                  threshold: 50
                  period: 3M
                  from: 2026-07
                  to: 2026-09
                  latest:
                    month: 2026-09
                    value: 51.9
                    previousMonth: 2026-08
                    previousValue: 53.3
                    change: -1.4
                    status: expansion
                    streak:
                      months: 15
                      since: 2025-07
                      isLowerBound: false
                    releasedAt: '2026-10-01T00:30:00.000Z'
                  points:
                    - month: 2026-07
                      value: 52.9
                      change: 1.1
                      status: expansion
                    - month: 2026-08
                      value: 53.3
                      change: 0.4
                      status: expansion
                    - month: 2026-09
                      value: 51.9
                      change: -1.4
                      status: expansion
                  source: S&P Global
                  unit: index_points
                  wasRestated: false
                meta:
                  source: S&P Global
                  series: >-
                    S&P Global Vietnam Manufacturing PMI — headline, seasonally
                    adjusted
                  as_of: 2026-09
                  released_at: '2026-10-01T00:30:00.000Z'
                  unit: index_points
                  classification:
                    value: RAW
                    change: COMPUTED
                    status: COMPUTED
                    streak: COMPUTED
                  formula_version: pmi-summary-v1
                  was_restated: false
                  served_from_cache: true
                  cache_expires_at: '2026-10-17T01:12:40.000Z'
                  timestamp: '2026-10-16T03:00:00.000Z'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    MacroPmiManufacturingResponse:
      allOf:
        - $ref: '#/components/schemas/EnvelopeBase'
        - type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/PmiManufacturingSeries'
            meta:
              $ref: '#/components/schemas/PmiMeta'
    EnvelopeBase:
      type: object
      description: >
        Standard success envelope shared by every endpoint. Each operation's
        response

        wrapper extends this (via `allOf`) and adds a typed `data` property.
      required:
        - success
        - statusCode
      properties:
        success:
          type: boolean
          const: true
          description: Always `true` for a successful response.
          example: true
        statusCode:
          type: integer
          description: Mirrors the HTTP status code.
          example: 200
        meta:
          $ref: '#/components/schemas/Meta'
    PmiManufacturingSeries:
      type: object
      description: >
        S&P Global Vietnam Manufacturing PMI over the requested window, with a
        summary of

        the latest reading. When nothing is on record (for example an `asOf`
        before the

        first reading), `from`, `to` and `latest` are `null` and `points` is
        empty.
      required:
        - country
        - seriesCode
        - threshold
        - period
        - from
        - to
        - latest
        - points
        - source
        - unit
        - wasRestated
      properties:
        country:
          type: string
          enum:
            - vn
          description: Country code, lowercase. Only Vietnam is available.
          example: vn
        seriesCode:
          type: string
          enum:
            - manufacturing_pmi
          description: Series identifier. Vietnam has a manufacturing PMI only.
          example: manufacturing_pmi
        threshold:
          type: number
          description: The 50 line — above it is expansion, below it contraction.
          example: 50
        period:
          type: string
          enum:
            - 3M
            - 6M
            - 1Y
            - 3Y
          description: Window that was applied.
          example: 3M
        from:
          type:
            - string
            - 'null'
          pattern: ^\d{4}-\d{2}$
          description: First month of the window (`YYYY-MM`).
          example: 2026-07
        to:
          type:
            - string
            - 'null'
          pattern: ^\d{4}-\d{2}$
          description: >-
            Last month of the window — the latest month with a reading (as known
            at `asOf`, when given).
          example: 2026-09
        latest:
          oneOf:
            - $ref: '#/components/schemas/PmiLatest'
            - type: 'null'
        points:
          type: array
          description: One entry per month from `from` to `to`, oldest first.
          items:
            $ref: '#/components/schemas/PmiPoint'
        source:
          type: string
          description: Data provider.
          example: S&P Global
        unit:
          type: string
          description: Unit of `value` and `change`.
          example: index_points
        wasRestated:
          type: boolean
          description: >-
            `true` when S&P Global revised any month in the window after first
            publishing it.
          example: false
    PmiMeta:
      description: >
        Response metadata for the PMI series. On top of `timestamp`, it says
        where the

        numbers came from, which fields HayInsights computes, and how fresh the
        response is.
      allOf:
        - $ref: '#/components/schemas/Meta'
        - type: object
          properties:
            source:
              type: string
              description: Data provider.
              example: S&P Global
            series:
              type: string
              description: Full name of the series.
              example: >-
                S&P Global Vietnam Manufacturing PMI — headline, seasonally
                adjusted
            as_of:
              type:
                - string
                - 'null'
              description: Latest month in the window (`YYYY-MM`).
              example: 2026-09
            released_at:
              type:
                - string
                - 'null'
              format: date-time
              description: When S&P Global published the latest reading (UTC).
              example: '2026-10-01T00:30:00.000Z'
            unit:
              type: string
              description: Unit of the numeric fields.
              example: index_points
            classification:
              type: object
              description: >
                How each field was produced: `value` is passed through as S&P
                Global published

                it; `change`, `status` and `streak` are computed by HayInsights.
              properties:
                value:
                  type: string
                  example: RAW
                change:
                  type: string
                  example: COMPUTED
                status:
                  type: string
                  example: COMPUTED
                streak:
                  type: string
                  example: COMPUTED
            formula_version:
              type: string
              description: Version tag of the formulas behind the computed fields.
              example: pmi-summary-v1
            was_restated:
              type: boolean
              description: Same as `data.wasRestated`.
              example: false
            served_from_cache:
              type: boolean
              description: Whether the response was served from cache.
              example: true
            cache_expires_at:
              type:
                - string
                - 'null'
              format: date-time
              description: >-
                When the cached copy expires (24 h; it is dropped as soon as a
                new reading is collected).
              example: '2026-10-17T01:12:40.000Z'
    ErrorBody:
      type: object
      description: Standard error envelope returned for every 4xx / 5xx response.
      required:
        - success
        - statusCode
        - error
      properties:
        success:
          type: boolean
          const: false
          description: Always `false` for an error response.
          example: false
        statusCode:
          type: integer
          description: Mirrors the HTTP status code.
          example: 401
        error:
          $ref: '#/components/schemas/ErrorDetail'
        meta:
          $ref: '#/components/schemas/Meta'
    Meta:
      type: object
      description: >-
        Response metadata. Always present; `timestamp` is the server time the
        response was generated.
      required:
        - timestamp
      properties:
        timestamp:
          type: string
          format: date-time
          description: Server time when the response was generated (ISO 8601).
          example: '2026-06-19T08:31:59.478Z'
      additionalProperties: true
    PmiLatest:
      type: object
      description: Summary of the latest month that has a reading.
      required:
        - month
        - value
        - previousMonth
        - previousValue
        - change
        - status
        - streak
        - releasedAt
      properties:
        month:
          type: string
          pattern: ^\d{4}-\d{2}$
          description: Month of the latest reading (`YYYY-MM`).
          example: 2026-09
        value:
          type: number
          description: Latest reading in index points.
          example: 51.9
        previousMonth:
          type: string
          pattern: ^\d{4}-\d{2}$
          description: The month before `month`.
          example: 2026-08
        previousValue:
          type:
            - number
            - 'null'
          description: Reading for `previousMonth`; `null` when that month has no reading.
          example: 53.3
        change:
          type:
            - number
            - 'null'
          description: >-
            `value − previousValue` in index points; `null` when `previousValue`
            is `null`.
          example: -1.4
        status:
          type: string
          enum:
            - expansion
            - no_change
            - contraction
          description: >-
            `expansion` above 50, `no_change` at exactly 50, `contraction` below
            50.
          example: expansion
        streak:
          type: object
          description: >-
            Consecutive months, counted back from `month`, with the same
            `status`.
          required:
            - months
            - since
            - isLowerBound
          properties:
            months:
              type: integer
              minimum: 1
              description: Length of the streak, `month` included.
              example: 15
            since:
              type: string
              pattern: ^\d{4}-\d{2}$
              description: First month of the streak.
              example: 2025-07
            isLowerBound:
              type: boolean
              description: >
                `true` when the month before `since` has no reading (a gap, or
                before the

                first month on record), so the real streak may be longer.
              example: false
        releasedAt:
          type: string
          format: date-time
          description: When S&P Global published the latest reading (UTC).
          example: '2026-10-01T00:30:00.000Z'
    PmiPoint:
      type: object
      description: >
        One month of the PMI series. A month without a reading stays in the list
        with

        `value: null` — never 0 — so a chart can draw the gap.
      required:
        - month
        - value
        - change
        - status
      properties:
        month:
          type: string
          pattern: ^\d{4}-\d{2}$
          description: Reference month (`YYYY-MM`).
          example: 2026-09
        value:
          type:
            - number
            - 'null'
          description: >-
            PMI reading in index points, one decimal as published. `null` when
            the month has no reading.
          example: 51.9
        change:
          type:
            - number
            - 'null'
          description: >
            Change from the previous month in index points (not percent). `null`
            when this

            month or the previous one has no reading.
          example: -1.4
        status:
          type:
            - string
            - 'null'
          enum:
            - expansion
            - no_change
            - contraction
            - null
          description: >
            Reading against the 50 line: `expansion` above 50, `no_change` at
            exactly 50,

            `contraction` below 50. `null` when the month has no reading.
          example: expansion
    ErrorDetail:
      type: object
      description: Error detail object carried under `error` in the error envelope.
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: >
            Machine-readable error code. Specific for authentication / quota
            errors

            (e.g. `API_KEY_REQUIRED`, `API_KEY_INVALID`, `FEATURE_NOT_IN_PLAN`,

            `RATE_LIMIT_EXCEEDED`). For validation (400) and not-found (404) the
            code

            is currently `INTERNAL_ERROR` and the HTTP status carries the
            semantics.
          example: API_KEY_INVALID
        message:
          description: Human-readable message, or a list of validation messages (400).
          oneOf:
            - type: string
            - type: array
              items:
                type: string
          example: Invalid API key
  responses:
    BadRequest:
      description: >-
        Invalid or missing parameter — bad enum, range, format, or a missing
        required query parameter.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            success: false
            statusCode: 400
            error:
              code: INTERNAL_ERROR
              message:
                - >-
                  Invalid type parameter. Must be "gdp", "cpi", "pce", or
                  "import-export"
                - Type parameter is required
            meta:
              error: Bad Request
              statusCode: 400
              timestamp: '2026-06-19T08:34:08.081Z'
    Unauthorized:
      description: >-
        Missing, invalid, disabled or expired API key. Send a valid key in the
        `X-API-Key` header.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            success: false
            statusCode: 401
            error:
              code: API_KEY_INVALID
              message: Invalid API key
            meta:
              timestamp: '2026-06-19T08:34:08.023Z'
    Forbidden:
      description: >-
        Your subscription plan does not include this data feature, or your key's
        scope denies it.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            success: false
            statusCode: 403
            error:
              code: FEATURE_NOT_IN_PLAN
              message: Your plan does not include this feature
            meta:
              timestamp: '2026-06-19T08:34:08.100Z'
    RateLimited:
      description: >
        Rate limit exceeded — you have consumed your plan's per-minute weight
        budget.

        Wait until `X-RateLimit-Reset` (or `Retry-After` seconds) then retry.
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/XRateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/XRateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/XRateLimitReset'
        X-RateLimit-Weight-Used:
          $ref: '#/components/headers/XRateLimitWeightUsed'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            success: false
            statusCode: 429
            error:
              code: RATE_LIMIT_EXCEEDED
              message: Rate limit exceeded
            meta:
              timestamp: '2026-06-19T08:34:09.000Z'
    InternalError:
      description: Unexpected server error. Retry after a short exponential backoff.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            success: false
            statusCode: 500
            error:
              code: INTERNAL_ERROR
              message: Internal server error
            meta:
              timestamp: '2026-06-19T08:34:10.000Z'
  headers:
    XRateLimitLimit:
      description: Your plan's request-weight budget per 1-minute window.
      schema:
        type: integer
        example: 1000
    XRateLimitRemaining:
      description: Remaining request weight in the current 1-minute window.
      schema:
        type: integer
        example: 997
    XRateLimitReset:
      description: Unix timestamp (seconds) when the current rate-limit window resets.
      schema:
        type: integer
        format: int64
        example: 1781857979
    XRateLimitWeightUsed:
      description: Request weight consumed by this call (see each endpoint's weight).
      schema:
        type: integer
        example: 3
    RetryAfter:
      description: Seconds to wait before retrying. Present on 429 responses.
      schema:
        type: integer
        example: 30
  securitySchemes:
    HayInsightsApiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: >
        Your HayInsights API key (prefixed `apk_`). Create and manage keys in
        the

        HayInsights dashboard (Account → API keys).


        Send it in the `X-API-Key` header on **every** request to
        `/openapi/v1/*`.

        Which data domains you may access and your request quota are both
        governed by

        the subscription plan attached to the key — see the **Plans & features**
        and

        **Rate limits** guides.

````

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