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

# Get the AI-Generated Outline for a Proposal

> GET .../ai/outline — Returns the AI-generated outline for a proposal. Status is Generating or Completed; the outline text is only present when Completed.

Returns the latest AI-generated outline for the specified proposal. The `status` field indicates whether generation is still in progress (`Generating`) or finished (`Completed`). The `outline` field is only populated once the status reaches `Completed`.

<Note>
  Outline generation is asynchronous. After calling [Generate Proposal Outline](/api-reference/ai-builder/generate-outline), poll this endpoint or listen for the `Proposal Outline Status Changed` webhook to know when the outline is ready.
</Note>

<RequestExample>
  ```bash curl theme={null}
  curl -i -X GET \
    'https://api.portal.io/public/proposals/12345/ai/outline' \
    -H 'Accept: application/json' \
    -H 'X-MSS-API-APPID: YOUR_API_APPID' \
    -H 'X-MSS-API-USERKEY: YOUR_API_USERKEY' \
    -H 'X-MSS-CUSTOM-DATE: Thu, 17 Apr 2026 12:00:00 GMT' \
    -H 'X-MSS-SIGNATURE: Base64EncodedHMACSHA256Signature'
  ```

  ```python python theme={null}
  import requests
  from portal_auth import sign_request  # See authentication guide

  url = "https://api.portal.io/public/proposals/12345/ai/outline"
  timestamp = "Mon, 06 Apr 2026 00:22:19 GMT"
  signature = sign_request("GET", url, "", timestamp, "YOUR_USER_KEY", "YOUR_SECRET_KEY")

  response = requests.get(url, headers={
      "Accept": "application/json",
      "X-MSS-API-APPID": "YOUR_APP_ID",
      "X-MSS-API-USERKEY": "YOUR_USER_KEY",
      "X-MSS-CUSTOM-DATE": timestamp,
      "X-MSS-SIGNATURE": signature
  })
  print(response.json())
  ```

  ```javascript node.js theme={null}
  const { signRequest } = require('./portalAuth'); // See authentication guide

  const url = "https://api.portal.io/public/proposals/12345/ai/outline";
  const timestamp = new Date().toUTCString();
  const signature = signRequest("GET", url, "", timestamp, "YOUR_USER_KEY", "YOUR_SECRET_KEY");

  const response = await fetch(url, {
      headers: {
          "Accept": "application/json",
          "X-MSS-API-APPID": "YOUR_APP_ID",
          "X-MSS-API-USERKEY": "YOUR_USER_KEY",
          "X-MSS-CUSTOM-DATE": timestamp,
          "X-MSS-SIGNATURE": signature
      }
  });
  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

```json Response (Completed) theme={null}
{
  "proposalId": 12345,
  "status": "Completed",
  "outline": "## Executive Summary\nThis proposal covers the development of...\n\n## Scope of Work\n..."
}
```

```json Response (Generating) theme={null}
{
  "proposalId": 12345,
  "status": "Generating",
  "outline": null
}
```


## OpenAPI

````yaml GET /public/api/proposals/{ProposalId}/ai/outline
openapi: 3.1.0
info:
  title: Portal.Api
  version: '1.0'
servers:
  - url: http://127.0.0.1:5000
security: []
tags: []
paths:
  /public/api/proposals/{ProposalId}/ai/outline:
    get:
      tags:
        - Proposal AI Builder
      summary: Get Proposal Outline
      description: >-
        Returns the latest requested AI outline for the specified proposal. The
        status is Completed when outline content is available and Generating
        while the outline is still being prepared. The Outline field is returned
        only when the status is Completed.
      operationId: GetAiProposalOutline
      parameters:
        - $ref: '#/components/parameters/Accept'
        - name: X-MSS-API-APPID
          in: header
          description: Application Id
          required: true
          schema:
            type: string
        - name: X-MSS-CUSTOM-DATE
          in: header
          description: A date timestamp of the request
          required: true
          schema:
            type: string
        - name: X-MSS-SIGNATURE
          in: header
          description: A signature for the request
          required: true
          schema:
            type: string
        - name: X-MSS-API-USERKEY
          in: header
          description: User API Key
          required: true
          schema:
            type: string
        - name: ProposalId
          in: path
          description: >-
            Unique identifier of the proposal to retrieve the AI-generated
            outline for.
          required: true
          x-nullable: false
          schema:
            type: integer
            format: int32
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicAiProposalOutlineGetResponse'
        '401':
          description: >-
            Not Authorized to access this endpoint or your HMAC hash was
            incorrect.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebServiceException'
        '403':
          description: You do not have permission for this API call.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HttpError'
        '404':
          description: Proposal or outline not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HttpError'
      deprecated: false
      x-codeSamples: []
components:
  parameters:
    Accept:
      name: Accept
      in: header
      description: Accept Header
      required: true
      schema:
        type: string
        enum:
          - application/json
  schemas:
    PublicAiProposalOutlineGetResponse:
      title: PublicAiProposalOutlineGetResponse
      required:
        - proposalId
        - status
      properties:
        proposalId:
          description: Unique identifier of the proposal for which the outline is returned.
          type: integer
          format: int32
        status:
          description: >-
            Current AI generation status for the proposal outline.

            - Generating: The outline generation is in progress and the
            'Outline' field will be null.

            - Completed: The outline has been generated successfully and is
            available in the 'Outline' field.

            - Failed: Generation failed and the 'Outline' field will be null.
            Check logs or retries for details.
          type: string
          enum:
            - Generating
            - Completed
            - Failed
        outline:
          description: >-
            The AI-generated proposal outline text. This field is populated only
            when 'Status' is 'Completed'. When 'Status' is 'Generating' or
            'Failed', this value will be null. The outline contains a structured
            summary of the proposal suitable for display or further processing
            by downstream agents.
          type: string
      description: PublicAiProposalOutlineGetResponse
      type: object
    WebServiceException:
      title: WebServiceException
      properties:
        statusCode:
          type: integer
          format: int32
        statusDescription:
          type: string
        responseHeaders:
          $ref: '#/components/schemas/WebHeaderCollection'
        responseDto:
          $ref: '#/components/schemas/Object'
        responseBody:
          type: string
        message:
          type: string
        errorCode:
          type: string
        errorMessage:
          type: string
        serverStackTrace:
          type: string
        state:
          $ref: '#/components/schemas/Object'
        responseStatus:
          $ref: '#/components/schemas/ResponseStatus'
        targetSite:
          $ref: '#/components/schemas/MethodBase'
        data:
          $ref: '#/components/schemas/IDictionary'
        innerException:
          $ref: '#/components/schemas/Exception'
        helpLink:
          type: string
        source:
          type: string
        hResult:
          type: integer
          format: int32
        stackTrace:
          type: string
      description: WebServiceException
      type: object
    HttpError:
      title: HttpError
      properties:
        errorCode:
          type: string
        stackTrace:
          type: string
        contentType:
          type: string
        headers:
          $ref: '#/components/schemas/Dictionary_String_String_'
        cookies:
          type: array
          items:
            $ref: '#/components/schemas/Cookie'
        status:
          type: integer
          format: int32
        statusCode:
          type: string
        statusDescription:
          type: string
        response:
          $ref: '#/components/schemas/Object'
        responseFilter:
          $ref: '#/components/schemas/IContentTypeWriter'
        requestContext:
          $ref: '#/components/schemas/IRequest'
        paddingLength:
          type: integer
          format: int32
        resultScope:
          $ref: '#/components/schemas/Func_IDisposable_'
        options:
          $ref: '#/components/schemas/IDictionary_String_String_'
        responseStatus:
          $ref: '#/components/schemas/ResponseStatus'
        targetSite:
          $ref: '#/components/schemas/MethodBase'
        message:
          type: string
        data:
          $ref: '#/components/schemas/IDictionary'
        innerException:
          $ref: '#/components/schemas/Exception'
        helpLink:
          type: string
        source:
          type: string
        hResult:
          type: integer
          format: int32
      description: HttpError
      type: object
    WebHeaderCollection:
      title: WebHeaderCollection
      properties: {}
      description: WebHeaderCollection
      type: object
    Object:
      properties: {}
      description: Object
      type: object
    ResponseStatus:
      title: ResponseStatus
      properties:
        errorCode:
          type: string
        message:
          type: string
        stackTrace:
          type: string
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ResponseError'
        meta:
          $ref: '#/components/schemas/Dictionary_String_String_'
      description: ResponseStatus
      type: object
    MethodBase:
      title: MethodBase
      properties: {}
      description: MethodBase
      type: object
    IDictionary:
      title: IDictionary
      properties: {}
      description: IDictionary
      type: object
    Exception:
      title: Exception
      properties: {}
      description: Exception
      type: object
    Dictionary_String_String_:
      title: Dictionary<String,String>
      additionalProperties:
        type: string
      description: Dictionary<String,String>
      type: object
    Cookie:
      title: Cookie
      properties: {}
      description: Cookie
      type: object
    IContentTypeWriter:
      title: IContentTypeWriter
      properties: {}
      description: IContentTypeWriter
      type: object
    IRequest:
      title: IRequest
      properties: {}
      description: IRequest
      type: object
    Func_IDisposable_:
      title: Func`1
      properties: {}
      description: Func<IDisposable>
      type: object
    IDictionary_String_String_:
      title: IDictionary<String,String>
      additionalProperties:
        type: string
      description: IDictionary<String,String>
      type: object
    ResponseError:
      title: ResponseError
      properties:
        errorCode:
          type: string
        fieldName:
          type: string
        message:
          type: string
        meta:
          $ref: '#/components/schemas/Dictionary_String_String_'
      description: ResponseError
      type: object

````