> This page is for Developers.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://zuora.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://zuora.ferndocs.com/_mcp/server.

# Create a test environment job

POST https://rest.test.zuora.com/test-environments/{id}/jobs
Content-Type: application/json

Use this operation to create a new job for a specific Test Environment.
It handles HTTP POST requests to the /test-environments/\{id}/jobs endpoint,
accepting a JobRequest object in the request body. Upon successful creation,
it returns a JobResponse object and sets the Location header to the polling
URL for the created job.

### User Access Permission

You must be assigned the **Refresh Central Sandbox** permission to run this operation.

Reference: https://zuora.ferndocs.com/developers/api-reference/zuora-api/test-environments/test-environment-jobs/create-test-environment-job

## Authentication

- `Authorization` header (bearer token, required) — Use `Bearer {{token}}` in the `Authorization` header for authentication.

## Servers

- `https://rest.test.zuora.com` (US Developer & Central Sandbox (incl. Test Drive), default)
- `https://rest.sandbox.na.zuora.com` (US API Sandbox Cloud 1)
- `https://rest.apisandbox.zuora.com` (US API Sandbox Cloud 2)
- `https://rest.na.zuora.com` (US Production Cloud 1)
- `https://rest.zuora.com` (US Production Cloud 2)
- `https://rest.test.eu.zuora.com` (EU Developer & Central Sandbox)
- `https://rest.sandbox.eu.zuora.com` (EU API Sandbox)
- `https://rest.eu.zuora.com` (EU Production)
- `https://rest.test.ap.zuora.com` (APAC Developer & Central Sandbox)
- `https://rest.ap.zuora.com` (APAC Production)

## Request

### Path parameters

- `id` (string, required) — Test Environment ID

### Headers

- `Zuora-Entity-Ids` (string, optional) — An entity ID. If you have [Zuora Multi-entity](https://knowledgecenter.zuora.com/BB_Introducing_Z_Business/Multi-entity) enabled and the OAuth token is valid for more than one entity, you must use this header to specify which entity to perform the operation in. If the OAuth token is only valid for a single entity, or you do not have Zuora Multi-entity enabled, you should not set this header.
- `Zuora-Track-Id` (string, optional) — A custom identifier for tracing the API call. If you set a value for this header, Zuora returns the same value in the response headers. This header enables you to associate your system process identifiers with Zuora API calls, to assist with troubleshooting in the event of an issue. The value of this field must use the US-ASCII character set and must not include any of the following characters: colon (`:`), semicolon (`;`), double quote (`"`), and quote (`'`).
- `Accept-Encoding` (string, optional) — Include the `Accept-Encoding: gzip` header to compress responses as a gzipped file. It can significantly reduce the bandwidth required for a response. If specified, Zuora automatically compresses responses that contain over 1000 bytes of data, and the response contains a `Content-Encoding` header with the compression algorithm so that your client can decompress it.
- `Content-Encoding` (string, optional) — Include the `Content-Encoding: gzip` header to compress a request. With this header specified, you should upload a gzipped file for the request payload instead of sending the JSON payload.

### Body (application/json)

This endpoint expects a JobRequest.

- `jobType` (enum, required) — The type of workflow job to be performed on the Test Environment
  - Allowed values: `REFRESH`
- `scheduledRefreshTime` (datetime, optional) — Optional date for scheduling a job

## Response

### 200

OK

- `createTime` (datetime, optional) — The date and time when the job was first synced to self service
- `createdById` (string, optional) — The automatically generated ID of the Zuora user who created the job object
- `estimatedCompletionTime` (datetime, optional) — The date and time when the job is estimated to be completed
- `id` (string, optional) — The unique ID (UUID) of the Test Environment job
- `jobEndTime` (datetime, optional) — The date and time when the job completed
- `jobStartTime` (datetime, optional) — The date and time when the job was started
- `jobType` (enum, optional) — The type of Test Environment job being performed
  - Allowed values: `REFRESH`, `CREATE`, `DELETE`
- `progressPercentage` (integer, optional) — The progress percentage of the job
- `scheduledRefreshTime` (datetime, optional) — The optional date and time for scheduling a job
- `status` (enum, optional) — The status of the Test Environment job
  - Allowed values: `NEW`, `SCHEDULED`, `QUEUED`, `INITIATED`, `PROVISIONING`, `DEPROVISIONING`, `EXPORTING`, `SCRUBBING`, `RESETTING`, `IMPORTING`, `FINALIZING`, `CANCELLING`, `COMPLETED`, `FAILED`, `CANCELLED`
- `testEnvironmentId` (string, optional) — The Test Environment to which this job belongs
- `updateTime` (datetime, optional) — The date and time when the job was last synced to self-service
- `updatedById` (string, optional) — The automatically generated ID of the Zuora user who updated the job object

### 201

Successfully created a new Test Environment job

- `createTime` (datetime, optional) — The date and time when the job was first synced to self service
- `createdById` (string, optional) — The automatically generated ID of the Zuora user who created the job object
- `estimatedCompletionTime` (datetime, optional) — The date and time when the job is estimated to be completed
- `id` (string, optional) — The unique ID (UUID) of the Test Environment job
- `jobEndTime` (datetime, optional) — The date and time when the job completed
- `jobStartTime` (datetime, optional) — The date and time when the job was started
- `jobType` (enum, optional) — The type of Test Environment job being performed
  - Allowed values: `REFRESH`, `CREATE`, `DELETE`
- `progressPercentage` (integer, optional) — The progress percentage of the job
- `scheduledRefreshTime` (datetime, optional) — The optional date and time for scheduling a job
- `status` (enum, optional) — The status of the Test Environment job
  - Allowed values: `NEW`, `SCHEDULED`, `QUEUED`, `INITIATED`, `PROVISIONING`, `DEPROVISIONING`, `EXPORTING`, `SCRUBBING`, `RESETTING`, `IMPORTING`, `FINALIZING`, `CANCELLING`, `COMPLETED`, `FAILED`, `CANCELLED`
- `testEnvironmentId` (string, optional) — The Test Environment to which this job belongs
- `updateTime` (datetime, optional) — The date and time when the job was last synced to self-service
- `updatedById` (string, optional) — The automatically generated ID of the Zuora user who updated the job object

## Errors

### 400 Bad Request Error

Bad request

## Examples

### Example 1

**Request**

```json
{
  "jobType": "REFRESH"
}
```

**Response**

```json
{
  "createTime": "2024-06-10T08:00:00Z",
  "createdById": "58f182ab203c447b8b9cd90382da030a",
  "estimatedCompletionTime": "2024-06-10T10:00:00Z",
  "id": "a3f1c9e2-7b4d-4f2a-9c3e-123456789abc",
  "jobEndTime": "2024-06-10T10:05:00Z",
  "jobStartTime": "2024-06-10T08:05:00Z",
  "jobType": "REFRESH",
  "progressPercentage": 45,
  "scheduledRefreshTime": "2024-06-10T08:00:00Z",
  "status": "PROVISIONING",
  "testEnvironmentId": "b7d9f8a1-2c3e-4d5f-8a9b-9876543210fe",
  "updateTime": "2024-06-10T09:30:00Z",
  "updatedById": "58f182ab203c447b8b9cd90382da030a"
}
```

**SDK Code**

```python
import requests

url = "https://rest.test.zuora.com/test-environments/id/jobs"

payload = { "jobType": "REFRESH" }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://rest.test.zuora.com/test-environments/id/jobs';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"jobType":"REFRESH"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://rest.test.zuora.com/test-environments/id/jobs"

	payload := strings.NewReader("{\n  \"jobType\": \"REFRESH\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://rest.test.zuora.com/test-environments/id/jobs")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"jobType\": \"REFRESH\"\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://rest.test.zuora.com/test-environments/id/jobs")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"jobType\": \"REFRESH\"\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://rest.test.zuora.com/test-environments/id/jobs', [
  'body' => '{
  "jobType": "REFRESH"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://rest.test.zuora.com/test-environments/id/jobs");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"jobType\": \"REFRESH\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["jobType": "REFRESH"] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://rest.test.zuora.com/test-environments/id/jobs")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Example 2

**Request**

```json
{
  "jobType": "REFRESH"
}
```

**Response**

```json
{
  "createTime": "2024-06-10T08:00:00Z",
  "createdById": "58f182ab203c447b8b9cd90382da030a",
  "estimatedCompletionTime": "2024-06-10T10:00:00Z",
  "id": "a3f1c9e2-7b4d-4f2a-9c3e-123456789abc",
  "jobEndTime": "2024-06-10T10:05:00Z",
  "jobStartTime": "2024-06-10T08:05:00Z",
  "jobType": "REFRESH",
  "progressPercentage": 45,
  "scheduledRefreshTime": "2024-06-10T08:00:00Z",
  "status": "PROVISIONING",
  "testEnvironmentId": "b7d9f8a1-2c3e-4d5f-8a9b-9876543210fe",
  "updateTime": "2024-06-10T09:30:00Z",
  "updatedById": "58f182ab203c447b8b9cd90382da030a"
}
```

**SDK Code**

```python
import requests

url = "https://rest.test.zuora.com/test-environments/id/jobs"

payload = { "jobType": "REFRESH" }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://rest.test.zuora.com/test-environments/id/jobs';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"jobType":"REFRESH"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://rest.test.zuora.com/test-environments/id/jobs"

	payload := strings.NewReader("{\n  \"jobType\": \"REFRESH\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://rest.test.zuora.com/test-environments/id/jobs")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"jobType\": \"REFRESH\"\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://rest.test.zuora.com/test-environments/id/jobs")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"jobType\": \"REFRESH\"\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://rest.test.zuora.com/test-environments/id/jobs', [
  'body' => '{
  "jobType": "REFRESH"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://rest.test.zuora.com/test-environments/id/jobs");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"jobType\": \"REFRESH\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["jobType": "REFRESH"] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://rest.test.zuora.com/test-environments/id/jobs")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```