---
layout: default
title: Execute Painless script
parent: Script APIs
nav_order: 7
---

## Execute Painless script

The Execute Painless script API allows you to run a script that is not stored.

### Path and HTTP methods

```json
GET /_scripts/painless/_execute
POST /_scripts/painless/_execute
```

### Request fields

| Field | Description | 
:--- | :---
| script | The script to run. Required|
| context | A context for the script. Optional. Default is `painless_test`. |
| context_setup | Specifies additional parameters for the context. Optional.| 

#### Example request

The following request uses the default `painless_context` for the script:

```json
GET /_scripts/painless/_execute
{
  "script": {
    "source": "(params.x + params.y)/ 2",
    "params": {
      "x": 80,
      "y": 100
    }
  }
}
```
{% include copy-curl.html %}

#### Example response

The response contains the average of two script parameters:

```json
{
  "result" : "90"
}
```

### Response fields

| Field | Description | 
:--- | :--- 
| result | The script result.|


## Script contexts

Choose different contexts to control the variables that are available to the script and the result's return type. The default context is `painless_test`.

### Painless test context

The `painless_test` context is the default script context that provides only the `params` variable to the script. The returned result is always converted to a string. See the preceding example request for a usage example.

### Filter context

The `filter` context runs the script as if the script were inside a script query. You must provide a test document in the context. The `_source`, stored fields, and `_doc` variables will be available to the script.

You can specify the following parameters for the filter context in the `context_setup`.

Parameter | Description
:--- | :---
document | The document that is indexed in memory temporarily and available to the script.
index | The name of the index that contains a mapping for the document.

For example, first create an index with a mapping for a test document:

```json
PUT /testindex1
{
  "mappings": {
    "properties": {
      "grad": {
        "type": "boolean"
      },
      "gpa": {
        "type": "float"
      }
    }
  }
}
```
{% include copy-curl.html %}

Run a script to determine if a student is eligible to graduate with honors:

```json
POST /_scripts/painless/_execute
{
  "script": {
    "source": "doc['grad'].value == true && doc['gpa'].value >= params.min_honors_gpa",
    "params": {
      "min_honors_gpa": 3.5
    }
  },
  "context": "filter",
  "context_setup": {
    "index": "testindex1",
    "document": {
      "grad": true,
      "gpa": 3.79
    }
  }
}
```
{% include copy-curl.html %}

The response contains the result:

```json
{
  "result" : true
}
```

### Score context

The `score` context runs a script as if the script were in a `script_score` function in a `function_score` query.

You can specify the following parameters for the score context in the `context_setup`.

Parameter | Description
:--- | :---
document | The document that is indexed in memory temporarily and available to the script.
index | The name of the index that contains a mapping for the document.
query | If the script uses the `_score` parameter, the query can specify to use the `_score` field to compute the score.

For example, first create an index with a mapping for a test document:

```json
PUT /testindex1
{
  "mappings": {
    "properties": {
      "gpa_4_0": {
        "type": "float"
      }
    }
  }
}
```
{% include copy-curl.html %}

Run a script that converts a GPA on a 4.0 scale into a different scale that is provided as a parameter:

```json
POST /_scripts/painless/_execute
{
  "script": {
    "source": "doc['gpa_4_0'].value * params.max_gpa / 4.0",
    "params": {
      "max_gpa": 5.0
    }
  },
  "context": "score",
  "context_setup": {
    "index": "testindex1",
    "document": {
      "gpa_4_0": 3.5
    }
  }
}
```
{% include copy-curl.html %}

The response contains the result:

```json
{
  "result" : 4.375
}
```