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

# Get published blogpost

> Returns one published article with rendered HTML. Use the complete slug returned by the list, including any builder prefix, and preserve the same `brokerId` for builder-scoped content. A missing, unpublished, or out-of-scope post returns 404.

**Shared limit: 60 requests per client IP per rolling 60 seconds**, across public Blogpost endpoints. See [Blogpost API overview](/build-on-omnichain/blogpost/overview) for visibility, rendering, caching, and error handling.




## OpenAPI

````yaml orderly.openapi get /api/public/v1/blogposts/{slug}
openapi: 3.0.1
info:
  title: EVM
  description: ''
  version: 1.0.0
servers:
  - url: https://api.orderly.org
    description: Mainnet
  - url: https://testnet-api.orderly.org
    description: Testnet
security: []
tags:
  - name: public
  - name: private
paths:
  /api/public/v1/blogposts/{slug}:
    get:
      tags:
        - public
      summary: Get published blogpost
      description: >
        Returns one published article with rendered HTML. Use the complete slug
        returned by the list, including any builder prefix, and preserve the
        same `brokerId` for builder-scoped content. A missing, unpublished, or
        out-of-scope post returns 404.


        **Shared limit: 60 requests per client IP per rolling 60 seconds**,
        across public Blogpost endpoints. See [Blogpost API
        overview](/build-on-omnichain/blogpost/overview) for visibility,
        rendering, caching, and error handling.
      parameters:
        - name: slug
          in: path
          required: true
          description: >-
            Exact returned slug, including any builder prefix. Lowercase
            letters, digits, hyphens, and underscores; the last character must
            be a letter or digit.
          schema:
            type: string
            minLength: 1
            maxLength: 165
            pattern: ^[a-z0-9_-]*[a-z0-9]$
          example: example_dex-autumn-trading-campaign
        - $ref: '#/components/parameters/blogpost_broker_id'
      responses:
        '200':
          description: Published article in the requested scope.
          headers:
            Cache-Control:
              schema:
                type: string
                example: public, max-age=30, s-maxage=30, stale-while-revalidate=60
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    allOf:
                      - $ref: '#/components/schemas/BlogpostSummary'
                      - type: object
                        required:
                          - html
                        properties:
                          html:
                            type: string
                            description: >-
                              Server-rendered, sanitized article HTML. Raw
                              Markdown is not returned. Applications supply
                              layout and styling.
                            example: >-
                              <h2>Campaign details</h2><p>Explore the campaign
                              schedule and participation requirements.</p>
        '400':
          $ref: '#/components/responses/BlogpostInvalidRequest'
        '404':
          description: Blogpost not found. Check the slug and broker scope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BlogpostServiceError'
              example:
                error: Blogpost not found
        '409':
          $ref: '#/components/responses/BlogpostIncompleteRevision'
        '429':
          $ref: '#/components/responses/BlogpostRateLimited'
        '500':
          $ref: '#/components/responses/BlogpostInternalError'
        '503':
          $ref: '#/components/responses/BlogpostUnavailable'
      security: []
      servers:
        - url: https://dex-api.orderly.network
          description: Mainnet / Production
        - url: https://testnet-dex-api.orderly.network
          description: Testnet / Staging
components:
  parameters:
    blogpost_broker_id:
      name: brokerId
      in: query
      description: >-
        Builder-platform scope. Trimmed length must be 1-128 characters. Omit
        for Orderly's official feed. Preserve this value when opening an article
        from a builder-scoped list. This filters to the broker without
        automatically adding posts from Orderly's official feed.
      schema:
        type: string
        minLength: 1
        maxLength: 128
      example: example_dex
  schemas:
    BlogpostSummary:
      type: object
      required:
        - id
        - publisher
        - category
        - slug
        - title
        - summary
        - coverUrl
        - coverLogoUrl
        - keywords
        - startsAt
        - endsAt
        - ctaUrl
        - author
        - publishedAt
        - updatedAt
      properties:
        id:
          type: string
          format: uuid
          description: Stable post identifier for UI keys and deduplication.
          example: 11111111-1111-4111-8111-111111111111
        publisher:
          type: string
          enum:
            - ORDERLY
            - BUILDER
          example: BUILDER
        category:
          type: string
          enum:
            - ANNOUNCEMENT
            - UPDATE
            - CAMPAIGN
          example: CAMPAIGN
        slug:
          type: string
          description: >-
            Complete identifier used in the detail URL, including any builder
            prefix.
          example: example_dex-autumn-trading-campaign
        title:
          type: string
          example: Autumn trading campaign
        summary:
          type: string
          description: Short description for cards and previews.
          example: Explore the campaign schedule and participation requirements.
        coverUrl:
          type: string
          nullable: true
          description: Optional banner-image URL.
          example: https://images.example.com/campaign-banner.webp
        coverLogoUrl:
          type: string
          nullable: true
          description: >-
            Optional post-specific logo URL, independent of the banner and
            author logo.
          example: null
        keywords:
          type: array
          description: Article keywords; may be empty.
          items:
            type: string
          example:
            - trading
            - campaign
        startsAt:
          type: string
          format: date-time
          nullable: true
          description: >-
            Start time in UTC. When present, takes precedence over publishedAt
            for list sorting, even if earlier. Does not automatically publish
            the post.
          example: '2026-10-01T00:00:00.000Z'
        endsAt:
          type: string
          format: date-time
          nullable: true
          description: >-
            End time in UTC. Does not determine sorting or automatically remove
            the post.
          example: '2026-10-31T23:59:00.000Z'
        ctaUrl:
          type: string
          nullable: true
          description: >-
            Optional HTTPS call-to-action URL. The consuming application
            supplies the button label.
          example: https://example.com/campaign
        author:
          type: object
          required:
            - brokerId
            - name
            - logo
          properties:
            brokerId:
              type: string
              description: >-
                Broker ID captured for the published revision. Official posts
                use orderly.
              example: example_dex
            name:
              type: string
              description: Author or DEX display name captured for the published revision.
              example: Example DEX
            logo:
              type: string
              nullable: true
              description: >-
                Current DEX avatar; may be an image data URI. Null for official
                Orderly posts or when unavailable. Can change independently of
                article timestamps; separate from coverLogoUrl.
              example: null
        publishedAt:
          type: string
          format: date-time
          description: >-
            Publication time in UTC for the requested scope. Orderly's official
            feed and builder-platform feeds may have different times. Not
            replaced by startsAt.
          example: '2026-09-20T12:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          description: >-
            Update time in UTC of the visible published revision for the
            requested scope, not the latest draft edit.
          example: '2026-09-20T12:00:00.000Z'
    BlogpostServiceError:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: >-
            Service error message. Use HTTP status and structured fields for
            error handling.
    BlogpostValidationError:
      type: object
      required:
        - success
        - error
      properties:
        success:
          type: boolean
          example: false
        error:
          type: object
          required:
            - issues
          properties:
            issues:
              type: array
              description: >-
                Validation issues. Each path identifies the affected query or
                path parameter; other fields depend on the validation failure.
              items:
                type: object
                properties:
                  path:
                    type: array
                    items:
                      oneOf:
                        - type: string
                        - type: integer
                  code:
                    type: string
                  message:
                    type: string
              example:
                - origin: number
                  code: too_big
                  maximum: 100
                  inclusive: true
                  path:
                    - limit
                  message: 'Too big: expected number to be <=100'
  responses:
    BlogpostInvalidRequest:
      description: >-
        Request validation failed. Correct the field identified by each issue's
        path.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/BlogpostValidationError'
    BlogpostIncompleteRevision:
      description: >-
        Article temporarily unavailable. Show an unavailable-content state and
        retry later.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/BlogpostServiceError'
    BlogpostRateLimited:
      description: >-
        Shared public Blogpost request budget exhausted. Honor Retry-After
        before retrying.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
            example: 30
        X-RateLimit-Limit:
          description: Maximum requests in the window.
          schema:
            type: integer
            example: 60
        X-RateLimit-Remaining:
          description: Remaining requests in the current budget.
          schema:
            type: integer
            example: 0
        X-RateLimit-Reset:
          description: Reset timestamp in Unix seconds.
          schema:
            type: integer
            format: int64
        Cache-Control:
          schema:
            type: string
            example: no-store
      content:
        application/json:
          schema:
            type: object
            required:
              - error
              - code
              - retryAfter
            properties:
              error:
                type: string
                example: Blogpost public rate limit exceeded
              code:
                type: string
                example: BLOGPOST_PUBLIC_RATE_LIMITED
              retryAfter:
                type: integer
                description: Remaining wait in seconds. Example value is illustrative.
                example: 30
    BlogpostInternalError:
      description: Failed to retrieve blogposts. Retry with backoff.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/BlogpostServiceError'
          example:
            error: Failed to retrieve blogposts
    BlogpostUnavailable:
      description: Service temporarily unavailable. Retry later with backoff.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/BlogpostServiceError'

````