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

# Generate teaser posts

> <Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Generates two social posts for an app, one for Instagram and one for LinkedIn, each with an image. They're written from the app alone, with no questions to answer first, and they're separate from the content plan.

The posts are generated once per app. Calling this again returns the existing posts rather than new ones, and a call while they're generating starts nothing. A failed generation can run again a day after it failed, and one that stops without finishing can run again after 4 minutes. Base44 can also regenerate the posts once after a change to their format.

The call returns as soon as generation starts, with a `status` of `generating`. Poll [Get social content state](/api-reference/get-social-content-state) and read `teaser` until its `status` is `ready` or `failed`. Generation takes up to 3 minutes. When Base44 has teaser generation turned off, the call returns a `status` of `null` and no posts.

This endpoint calls a language model and an image model, but it's free. It doesn't use any credits.

This is limited to 5 requests a minute per app for each workspace's personal API keys, so every key in a workspace shares one allowance, separately from the other social content endpoints. Some workspaces have a different limit.

<Note>This endpoint accepts a personal API key. Workspace API keys are not authorized for it and are rejected with a 403.</Note>

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time.</Warning>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/apps/{app_id}/virality/teaser
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - PersonalAccessTokenAuth: []
paths:
  /api/apps/{app_id}/virality/teaser:
    post:
      summary: Generate teaser posts
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Generates two social posts for an app, one for Instagram and one for
        LinkedIn, each with an image. They're written from the app alone, with
        no questions to answer first, and they're separate from the content
        plan.


        The posts are generated once per app. Calling this again returns the
        existing posts rather than new ones, and a call while they're generating
        starts nothing. A failed generation can run again a day after it failed,
        and one that stops without finishing can run again after 4 minutes.
        Base44 can also regenerate the posts once after a change to their
        format.


        The call returns as soon as generation starts, with a `status` of
        `generating`. Poll [Get social content
        state](/api-reference/get-social-content-state) and read `teaser` until
        its `status` is `ready` or `failed`. Generation takes up to 3 minutes.
        When Base44 has teaser generation turned off, the call returns a
        `status` of `null` and no posts.


        This endpoint calls a language model and an image model, but it's free.
        It doesn't use any credits.


        This is limited to 5 requests a minute per app for each workspace's
        personal API keys, so every key in a workspace shares one allowance,
        separately from the other social content endpoints. Some workspaces have
        a different limit.


        <Note>This endpoint accepts a personal API key. Workspace API keys are
        not authorized for it and are rejected with a 403.</Note>


        <Warning>The response includes fields beyond the ones documented here.
        Don't rely on undocumented response fields, as they can change at any
        time.</Warning>
      operationId: generate_teaser_api_api_apps__app_id__virality_teaser_post
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app.
            title: App Id
          description: ID of the app.
          example: 6820f3a4e7b91d003c45a1f2
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TeaserSummary'
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have editor access to this app, or you used a read-only or
            workspace API key.
        '404':
          description: >-
            App not found, or the social content feature is not enabled for your
            account.
        '429':
          description: Rate limit exceeded (5 requests per minute).
components:
  schemas:
    TeaserSummary:
      properties:
        status:
          anyOf:
            - $ref: '#/components/schemas/TeaserStatus'
            - type: 'null'
          description: >-
            State of the teaser generation. Either `"generating"`, `"ready"`, or
            `"failed"`, or `null` if it was never started for this app.
          example: ready
        post:
          anyOf:
            - $ref: '#/components/schemas/SocialPost'
            - type: 'null'
          description: >-
            The first entry of `posts`, or `null` if the teaser has none. Kept
            for compatibility, so read `posts` instead.
        posts:
          items:
            $ref: '#/components/schemas/SocialPost'
          type: array
          title: Posts
          description: >-
            The teaser posts, one per platform. A regeneration keeps the posts
            it is replacing, so these can be set while `status` is `generating`.
      type: object
      title: TeaserSummary
      description: >-
        The standalone teaser posts for an app and the state of their
        generation.
    TeaserStatus:
      type: string
      enum:
        - generating
        - ready
        - failed
      title: TeaserStatus
    SocialPost:
      properties:
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
          description: >-
            ID of the post. Pass it as `post_id` to [Refine a
            post](/api-reference/refine-a-post), [Update post
            content](/api-reference/update-post-content), and [Generate a post
            image](/api-reference/generate-a-post-image).
          example: 3f2504e0-4f89-11d3-9a0c-0305e82c3301
        platform:
          anyOf:
            - $ref: '#/components/schemas/Platform'
            - type: 'null'
          description: Platform the post is written for.
          example: instagram
        angle:
          anyOf:
            - $ref: '#/components/schemas/PostAngle'
            - type: 'null'
          description: Editorial angle the post takes.
          example: pain_point
        angle_label:
          anyOf:
            - type: string
            - type: 'null'
          title: Angle Label
          description: Human-readable label for the angle.
          example: Pain point
        post_number:
          anyOf:
            - type: integer
            - type: 'null'
          title: Post Number
          description: Position of this post within its platform's set, starting at 1.
          example: 1
        total_posts:
          anyOf:
            - type: integer
            - type: 'null'
          title: Total Posts
          description: Number of posts generated for this platform.
          example: 5
        suggested_day:
          anyOf:
            - type: integer
            - type: 'null'
          title: Suggested Day
          description: Suggested day to publish on, counted from the start of the campaign.
          example: 1
        rationale:
          anyOf:
            - type: string
            - type: 'null'
          title: Rationale
          description: Why this post works for this platform and angle.
          example: Opens on the spreadsheet frustration the audience already has.
        content:
          anyOf:
            - type: string
            - type: 'null'
          title: Content
          description: >-
            The post text, ready to publish. Change it with [Update post
            content](/api-reference/update-post-content).
          example: >-
            Still tracking leads in a spreadsheet? I built the thing I wanted
            instead.
        image_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Image Url
          description: >-
            URL of the post image, or `null` if no image was generated yet.
            Create one with [Generate a post
            image](/api-reference/generate-a-post-image).
          example: https://storage.base44.com/virality/3f2504e0.png
        image_prompt:
          anyOf:
            - type: string
            - type: 'null'
          title: Image Prompt
          description: >-
            Prompt used to generate the post image, or `null` if the post has
            none.
          example: A freelancer closing a laptop at a tidy desk, warm morning light
        hashtags:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Hashtags
          description: Suggested hashtags, without the leading `#`.
          example:
            - freelance
            - buildinpublic
        post_title:
          anyOf:
            - type: string
            - type: 'null'
          title: Post Title
          description: >-
            Title for platforms that use one, such as Reddit and LinkedIn, or
            `null` elsewhere.
          example: I built a CRM because spreadsheets kept losing my leads
        suggested_subreddits:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Suggested Subreddits
          description: Subreddits to consider for a Reddit post. Empty for other platforms.
          example:
            - r/freelance
            - r/SideProject
        launch_comment:
          anyOf:
            - type: string
            - type: 'null'
          title: Launch Comment
          description: >-
            First comment to post under the main post, or `null` if none was
            generated.
          example: Happy to answer questions about how it works.
        option_label:
          anyOf:
            - type: string
            - type: 'null'
          title: Option Label
          description: >-
            Label for this post when the platform's `mode` is `selection`, so
            you can tell the alternatives apart, or `null` in `series` mode.
          example: Direct and personal
        best_for_context:
          anyOf:
            - type: string
            - type: 'null'
          title: Best For Context
          description: >-
            When to prefer this option over the others, or `null` if not
            applicable.
          example: Best if your audience already knows you
      type: object
      title: SocialPost
    Platform:
      type: string
      enum:
        - x
        - instagram
        - tiktok
        - linkedin
        - reddit
        - facebook
      title: Platform
    PostAngle:
      type: string
      enum:
        - pain_point
        - feature_demo
        - social_proof
        - trending_hook
        - user_story
        - before_after
      title: PostAngle
  securitySchemes:
    PersonalAccessTokenAuth:
      type: http
      scheme: bearer
      description: 'Personal access token, sent as `Authorization: Bearer <token>`.'

````