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

# List the recipes Prelude maintains

> **Beta.** The request and response shapes may still change.

List the Prelude-authored recipes you can extend. To use one, create a recipe of your own with `base_recipe_id` set to its identifier: your recipe scores the managed recipe's rules, which you cannot change, plus any rules you add, and sets the parameters the managed recipe exposes within their bounds.

A managed recipe is opaque: it is returned with a description, its threshold and the parameters you may set. Its rules are not returned.

Managed recipes are Prelude's own: ready-made protections every customer can extend and none can edit. To use one, [create a recipe](https://docs.prelude.so/watch/v2/api-reference/management/recipes/create-recipe.md) with `base_recipe_id` set to its identifier, and add the recipe to a flow.

## What you can change

A recipe extending a managed recipe:

* Scores the managed recipe's rules, which Prelude maintains. They are not listed, and you cannot change or remove them.
* Can add rules of its own - yours or managed rules - with weights you choose.
* Sets the parameters the managed recipe exposes, by the keys of its `parameters`, within their bounds: a `BOOL`, an `INT` or `DOUBLE` between `value_min` and `value_max`, a `STRING`, or an `ENUM` from its `values`. A parameter you leave unset uses its `default_value`.
* Moves the threshold within `threshold_bounds`. Without bounds, the threshold is the managed recipe's.

```json theme={null}
{
  "name": "sms_pumping",
  "status": "SHADOW",
  "threshold": 60,
  "rules": [],
  "base_recipe_id": "rcp_01jc0t6fwwfgfsq1md24mhyztj",
  "parameters": { "max_attempts": "8", "level": "high" }
}
```

## What you get, and what you don't

A managed recipe is returned with an identifier, a description, its threshold and the parameters you may set. Its name and its rules are not returned: a managed recipe is opaque. A recipe extending it lists only the rules you add.


## OpenAPI

````yaml get /v2/watch/management/recipes/managed
openapi: 3.1.0
info:
  title: Prelude API
  version: 2.0.0
  description: The Prelude API allows you to send messages to your users.
  contact:
    email: support@prelude.so
servers:
  - url: https://api.prelude.dev
    description: Production server
security:
  - apiToken: []
tags:
  - name: Notify
    description: Send transactional and marketing messages with compliance enforcement.
  - name: Transactional
    description: Send transactional messages (deprecated - use Notify API instead).
  - name: Verify
    description: Verify phone numbers.
  - name: Watch
    description: Evaluate email addresses and phone numbers for trustworthiness.
  - name: Lookup
    description: >-
      Retrieve detailed information about a phone number including carrier data,
      line type, and portability status.
paths:
  /v2/watch/management/recipes/managed:
    get:
      tags:
        - Watch
      summary: List managed recipes
      description: >-
        **Beta.** The request and response shapes may still change.


        List the Prelude-authored recipes you can extend. To use one, create a
        recipe of your own with `base_recipe_id` set to its identifier: your
        recipe scores the managed recipe's rules, which you cannot change, plus
        any rules you add, and sets the parameters the managed recipe exposes
        within their bounds.


        A managed recipe is opaque: it is returned with a description, its
        threshold and the parameters you may set. Its rules are not returned.
      operationId: listManagedWatchRecipes
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
            default: 50
          description: >-
            Maximum number of recipes to return per page. A larger value is
            clamped to 200 rather than refused.
        - name: cursor
          in: query
          required: false
          schema:
            type: string
          description: Pagination cursor from the previous response.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WatchManagedRecipeListResponse'
        '400':
          description: KO
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    WatchManagedRecipeListResponse:
      type: object
      properties:
        recipes:
          type: array
          items:
            $ref: '#/components/schemas/WatchManagedRecipe'
        next_cursor:
          type: string
          description: >-
            Pass this back as `cursor` for the next page. Absent on the last
            page.
          examples:
            - rcp_01jc0t6fwwfgfsq1md24mhyztj
      required:
        - recipes
    Error:
      type: object
      properties:
        code:
          type: string
          description: The error code.
          examples:
            - invalid_phone_number
        message:
          type: string
          examples:
            - >-
              The provided phone number is invalid. Provide a valid E.164 phone
              number.
          description: A human-readable message describing the error.
        type:
          type: string
          examples:
            - bad_request
          description: The error type.
        request_id:
          type: string
          examples:
            - 3d19215e-2991-4a05-a41a-527314e6ff6a
          description: >-
            A string that identifies this specific request. Report it back to us
            to help us diagnose your issues.
        param:
          type: string
          examples:
            - phone_number
          description: The parameter the error refers to, when it applies to a single one.
      required:
        - code
        - message
        - type
    WatchManagedRecipe:
      type: object
      properties:
        id:
          type: string
          examples:
            - rcp_01jc0t6fwwfgfsq1md24mhyztj
          description: >-
            The managed recipe identifier. Set it as `base_recipe_id` on a
            recipe of your own to extend it.
        description:
          type: string
          description: What the recipe catches.
          examples:
            - >-
              Flags SMS pumping: bursts of verifications to premium-rate
              numbers.
        threshold:
          type: integer
          format: int64
          description: >-
            The managed recipe's threshold, which a recipe extending it uses
            unless it sets its own within `threshold_bounds`.
          examples:
            - 50
        threshold_bounds:
          type: object
          description: >-
            The range, inclusive, a recipe extending this one may set its
            threshold in. Absent, the threshold is fixed.
          properties:
            min:
              type: integer
              format: int64
            max:
              type: integer
              format: int64
          required:
            - min
            - max
          examples:
            - min: 30
              max: 80
        parameters:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/WatchParameterSpec'
          description: >-
            The parameters a recipe extending this one may set, keyed by
            parameter name. The name is the key to set in the recipe's
            `parameters`. The managed recipe's rules read them; custom rules
            cannot.
      required:
        - id
        - description
        - threshold
        - parameters
    WatchParameterSpec:
      type: object
      properties:
        type:
          type: string
          enum:
            - BOOL
            - INT
            - DOUBLE
            - STRING
            - ENUM
          description: >
            The type of the value. Values are sent as strings in their canonical
            form:
             * `BOOL` - `true` or `false`.
             * `INT` - a base-10 integer with no sign other than `-` and no leading zero, within ±2^53.
             * `DOUBLE` - a finite decimal number.
             * `STRING` - non-empty text, at most 1,024 characters.
             * `ENUM` - one of `values`.
        default_value:
          type: string
          description: The value used when you set none.
          examples:
            - '5'
        value_min:
          type: number
          description: >-
            The smallest value allowed, inclusive. Only for `INT` and `DOUBLE`;
            absent when there is no lower bound.
          examples:
            - 1
        value_max:
          type: number
          description: >-
            The largest value allowed, inclusive. Only for `INT` and `DOUBLE`;
            absent when there is no upper bound.
          examples:
            - 20
        values:
          type: array
          items:
            type: string
          description: The values allowed for an `ENUM`.
          examples:
            - - low
              - medium
              - high
      required:
        - type
        - default_value
  securitySchemes:
    apiToken:
      type: http
      scheme: bearer

````

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