Fast by default
Stay in the terminal and keep your hands on the keyboard.
Open-source terminal REST client
Write, send, inspect, and automate HTTP requests from readable files without leaving your terminal. Keep every collection versioned beside the code it exercises, ready for the TUI, CLI, scripts, and coding agents.
curl -LsSf https://noodlerest.dev/install.sh | shPut names, email addresses, and text directly into a JSON body with $random placeholders. Compare the template with its sample response.
| Key | Value |
|---|---|
| Content-Type | application/json |
| Accept | application/json |
No query parameters.
No path parameters.
{
"postId": 1,
"name": $random.name,
"email": $random.email,
"body": $random.loremSentence
}
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"postId": 1,
"id": 501,
"name": "Ada Lovelace",
"email": "ada@example.com",
"body": "Sent from Noodle."
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
POST https://jsonplaceholder.typicode.com/comments201 CreatedBody received · 117 bytesCompleted in 124msNo cookies captured.
No execution results.
| Key | Value |
|---|---|
| Content-Type | application/json |
| Accept | application/json |
No query parameters.
No path parameters.
{
"title": "$random.words({\"count\":3})",
"userId": $random.number({"min":1,"max":10}),
"requestId": $random.uuid,
"role": $random.pick(["admin","user"]),
"active": $random.boolean
}
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 101,
"title": "Ship useful things",
"userId": 3,
"requestId": "a6f48b17-2d04-4c25-a853-e382e2d4af19",
"role": "user",
"active": true
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
POST https://jsonplaceholder.typicode.com/posts201 CreatedBody received · 154 bytesCompleted in 116msNo cookies captured.
No execution results.
| Key | Value |
|---|---|
| Content-Type | application/json |
| Accept | application/json |
No query parameters.
No path parameters.
{
"title": "Timestamped post",
"body": "Created at $time.iso",
"createdAt": $time.iso,
"timestampMs": $time.now,
"timestampSeconds": $time.unix
}
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 101,
"title": "Timestamped post",
"body": "Created at 2026-09-26T12:00:00.000Z",
"createdAt": "2026-09-26T12:00:00.000Z",
"timestampMs": 1790424000000,
"timestampSeconds": 1790424000
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
POST https://jsonplaceholder.typicode.com/posts201 CreatedBody received · 204 bytesCompleted in 102msNo cookies captured.
No execution results.
No request headers.
No query parameters.
| Key | Value |
|---|---|
| userId | 1 |
| postId | 1 |
This GET request has no body.
| Enabled | Expression | Operator | Expected |
|---|---|---|---|
| Enabled | status | 200 | |
| Enabled | headers.content-type | application/json | |
| Enabled | body.id | ||
| Enabled | response.time | 3000 |
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"userId": 1,
"id": 1,
"title": "A post from Noodle",
"body": "Requests live in readable YAML files."
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://api.example.com/users/1/posts/1200 OKBody received · 112 bytesCompleted in 86msNo cookies captured.
Sample results
| Key | Value |
|---|---|
| Content-Type | application/json |
| Accept | application/json |
No query parameters.
No path parameters.
{
"title": "Capture example",
"userId": 1
}
No response assertions.
| Enabled | Variable | Expression | Persistence |
|---|---|---|---|
| Enabled | created_post_id | body.id | |
| Enabled | created_user_id | body.userId | |
| Enabled | response_content_type | headers.content-type |
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 101,
"title": "Capture example",
"userId": 1
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
POST https://jsonplaceholder.typicode.com/posts201 CreatedBody received · 60 bytesCompleted in 112msNo cookies captured.
Sample results
| Key | Value |
|---|---|
| Accept | $response_content_type |
| X-Source-Post | $created_post_id |
| Key | Value |
|---|---|
| created_post_id | $created_post_id |
| include | posts |
No path parameters.
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 1,
"name": "Ada Lovelace",
"username": "ada",
"email": "ada@example.com",
"posts": [
{
"id": 101,
"title": "Capture example",
"userId": 1
}
]
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://api.example.com/users/$created_user_id?created_post_id=%24created_post_id&include=posts200 OKBody received · 189 bytesCompleted in 93msNo cookies captured.
No execution results.
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
Bearer token sent in the Authorization header.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"authenticated": true,
"token": "[REDACTED]"
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://httpbin.org/bearer200 OKBody received · 52 bytesCompleted in 98msNo cookies captured.
No execution results.
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
Username used for HTTP Basic authentication.
Password used for HTTP Basic authentication.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"authenticated": true,
"user": "demo"
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://httpbin.org/basic-auth/$username/$password200 OKBody received · 45 bytesCompleted in 98msNo cookies captured.
No execution results.
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
Header or query parameter name for the API key.
API key value sent with the request.
Where to send the API key.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"headers": {
"X-Api-Key": "[REDACTED]"
}
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://httpbin.org/headers200 OKBody received · 52 bytesCompleted in 98msNo cookies captured.
No execution results.
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
OAuth flow used to obtain the access token.
OIDC issuer or discovery document URL used to fill missing OAuth endpoints.
Public identifier for the OAuth client.
Secret used to authenticate the OAuth client.
Space-separated permissions requested from the provider.
Callback URI registered with the provider.
Protect authorization-code exchanges with a code verifier.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 1,
"name": "Ada Lovelace",
"username": "ada",
"email": "ada@example.com"
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://api.example.com/v1/profile200 OKBody received · 90 bytesCompleted in 98msNo cookies captured.
No execution results.
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
Public identifier for the OAuth client.
Shared secret used to sign OAuth requests.
Token identifying the authorized user or resource.
Secret paired with the access token for signing.
Algorithm used to sign the request.
Where to place OAuth parameters in the request.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 1,
"name": "Ada Lovelace",
"username": "ada",
"email": "ada@example.com"
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://api.example.com/v1/profile200 OKBody received · 90 bytesCompleted in 98msNo cookies captured.
No execution results.
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
AWS access key ID used to identify the signer.
AWS secret access key used to sign the request.
AWS region for the target service.
AWS service name included in the signing scope.
Optional token for temporary AWS credentials.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"items": [
{
"id": 1,
"name": "Sample item"
}
]
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://api.example.com/items200 OKBody received · 75 bytesCompleted in 98msNo cookies captured.
No execution results.
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 1,
"name": "Ada Lovelace",
"username": "ada",
"email": "ada@example.com"
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://intranet.example.com/api/profile200 OKBody received · 90 bytesCompleted in 98msNo cookies captured.
No execution results.
| Key | Value |
|---|---|
| Content-Type | application/json |
| Accept | application/json |
No query parameters.
No path parameters.
{
"title": "Prepared with a script",
"userId": 1
}
No response assertions.
No response captures.
Write inline or use a .js file.
const requestId = noodle.random.uuid();
const now = noodle.time.now();
noodle.request.headers.set("X-Request-ID", requestId);
noodle.request.headers.set("X-Sent-At", noodle.time.iso(now));
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 101,
"title": "Prepared with a script",
"userId": 1
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
POST https://jsonplaceholder.typicode.com/posts201 CreatedBody received · 67 bytesCompleted in 108msNo cookies captured.
Sample results
No request headers.
No query parameters.
| Key | Value |
|---|---|
| teamId | engineering |
| userId | 1 |
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
const user = noodle.response.json();
if (noodle.response.status === 200) {
noodle.run.set("USER_EMAIL", user.email);
noodle.run.set("USER_NAME", user.name);
}
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 1,
"name": "Ada Lovelace",
"username": "ada",
"email": "ada@example.com",
"teamId": "engineering"
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://api.example.com/teams/engineering/users/1200 OKBody received · 117 bytesCompleted in 108msNo cookies captured.
Sample results
| Key | Value |
|---|---|
| Content-Type | application/json |
| Accept | application/json |
No query parameters.
No path parameters.
{
"event": "order.created",
"orderId": 42
}
No response assertions.
No response captures.
Write inline or use a .js file.
const secret = noodle.env.get("signing_secret");
const payload = noodle.request.body.text();
const signature = noodle.crypto.hmacSha256(secret, payload, "hex");
noodle.request.headers.set("X-Signature", signature);
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"json": {
"event": "order.created",
"orderId": 42
},
"headers": {
"X-Signature": "[REDACTED]"
}
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
POST https://httpbin.org/post200 OKBody received · 119 bytesCompleted in 137msNo cookies captured.
Sample results
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
const post = await noodle.runRequest("assertions/get-post");
const user = await noodle.sendRequest({
url: "https://jsonplaceholder.typicode.com/users/" + post.json().userId,
});
noodle.request.headers.set("X-User-Name", user.json().username);
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"userId": 1,
"id": 1,
"title": "A post from Noodle",
"body": "Requests live in readable YAML files."
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://jsonplaceholder.typicode.com/posts/1200 OKBody received · 112 bytesCompleted in 186msNo cookies captured.
Sample results
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
./scripts/prepare-request.js
noodle.request.headers.set("X-Request-ID", noodle.random.uuid());
noodle.request.headers.set("Accept", "application/json");
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"userId": 1,
"id": 1,
"title": "A post from Noodle",
"body": "Requests live in readable YAML files."
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://jsonplaceholder.typicode.com/posts/1200 OKBody received · 112 bytesCompleted in 105msNo cookies captured.
Sample results
| Key | Value |
|---|---|
| Content-Type | application/json |
| Accept | application/json |
No query parameters.
| Key | Value |
|---|---|
| userId | 1 |
| todoId | 1 |
{
"completed": true
}
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
test("todo is complete", () => {
expect(noodle.response.json().completed).toBe(true);
});
test("todo belongs to user 1", () => {
expect(noodle.response.json().userId).toBe(1);
});
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"userId": 1,
"id": 1,
"title": "Try Noodle",
"completed": true
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
PATCH https://api.example.com/users/1/todos/1200 OKBody received · 74 bytesCompleted in 109msNo cookies captured.
Sample results
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
test("user matches the schema", () => {
expect(noodle.response.json()).toMatchSchema({
type: "object",
required: ["id", "name", "email"],
properties: {
id: { type: "integer", minimum: 1 },
name: { type: "string", minLength: 1 },
email: { type: "string", format: "email" },
},
});
});
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 1,
"name": "Ada Lovelace",
"username": "ada",
"email": "ada@example.com"
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://jsonplaceholder.typicode.com/users/1200 OKBody received · 90 bytesCompleted in 94msNo cookies captured.
Sample results
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
for (const user of noodle.response.json()) {
test("user " + user.id + " has contact details", () => {
expect(user.id).toBeGreaterThan(0);
expect(user.name).not.toBe("");
expect(user.email).toContain("@");
});
}
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
[
{
"id": 1,
"name": "Ada Lovelace",
"username": "ada",
"email": "ada@example.com"
},
{
"id": 2,
"name": "Grace Hopper",
"username": "grace",
"email": "grace@example.com"
}
]
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://jsonplaceholder.typicode.com/users200 OKBody received · 214 bytesCompleted in 117msNo cookies captured.
Sample results
No request headers.
No query parameters.
No path parameters.
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
// In F5, select a CSV or JSON data file.
// Example JSON row: { "user_id": 1 }
test("user matches the current data row", () => {
const row = noodle.iteration?.data;
expect(row).toBeDefined();
expect(noodle.response.json().id).toBe(Number(row.user_id));
});
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 1,
"name": "Ada Lovelace",
"username": "ada",
"email": "ada@example.com"
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://jsonplaceholder.typicode.com/users/$user_id200 OKBody received · 90 bytesCompleted in 97msNo cookies captured.
Sample results
No request headers.
No query parameters.
| Key | Value |
|---|---|
| postId | 1 |
| commentId | 1 |
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"postId": 1,
"id": 1,
"name": "A useful example",
"email": "ada@example.com",
"body": "Sent from Noodle."
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://api.example.com/posts/1/comments/1200 OKBody received · 119 bytesCompleted in 86msNo cookies captured.
No execution results.
No request headers.
| Key | Value |
|---|---|
| userId | 1 |
| _limit | 2 |
| _sort (disabled) | title |
No path parameters.
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
[
{
"userId": 1,
"id": 1,
"title": "A post from Noodle",
"body": "Requests live in readable YAML files."
},
{
"userId": 1,
"id": 2,
"title": "Another post",
"body": "Requests live in readable YAML files."
}
]
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://jsonplaceholder.typicode.com/posts?userId=1&_limit=2200 OKBody received · 248 bytesCompleted in 91msNo cookies captured.
No execution results.
| Key | Value |
|---|---|
| Content-Type | application/json |
| Accept | application/json |
No query parameters.
| Key | Value |
|---|---|
| postId | 1 |
| commentId | 1 |
{
"body": "Updated with Noodle."
}
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"postId": 1,
"id": 1,
"name": "A useful example",
"email": "ada@example.com",
"body": "Updated with Noodle."
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
PATCH https://api.example.com/posts/1/comments/1200 OKBody received · 122 bytesCompleted in 112msNo cookies captured.
No execution results.
| Key | Value |
|---|---|
| Content-Type | application/json |
| Accept | application/json |
No query parameters.
| Key | Value |
|---|---|
| userId | 1 |
| postId | 1 |
{
"title": "Replaced title",
"body": "Replaced body",
"userId": 1
}
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"id": 1,
"title": "Replaced title",
"body": "Replaced body",
"userId": 1
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
PUT https://api.example.com/users/1/posts/1200 OKBody received · 84 bytesCompleted in 103msNo cookies captured.
No execution results.
No request headers.
No query parameters.
| Key | Value |
|---|---|
| userId | 1 |
| postId | 1 |
This DELETE request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
DELETE https://api.example.com/users/1/posts/1200 OKBody received · 2 bytesCompleted in 78msNo cookies captured.
No execution results.
| Key | Value |
|---|---|
| Content-Type | application/x-www-form-urlencoded |
| Accept | application/json |
No query parameters.
No path parameters.
| Name | Value |
|---|---|
| name | Ada Lovelace |
| ada@example.com |
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"form": {
"name": "Ada Lovelace",
"email": "ada@example.com"
}
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
POST https://httpbin.org/post200 OKBody received · 78 bytesCompleted in 121msNo cookies captured.
No execution results.
No request headers.
No query parameters.
No path parameters.
| Name | Value | Type |
|---|---|---|
| username | ada | text |
| readme | ./README.md | file |
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"form": {
"username": "ada"
},
"files": {
"readme": "# Example collection"
}
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
POST https://httpbin.org/post200 OKBody received · 96 bytesCompleted in 149msNo cookies captured.
No execution results.
| Key | Value |
|---|---|
| Content-Type | application/octet-stream |
| Accept | application/json |
No query parameters.
No path parameters.
File: ./README.md
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"data": "# Example collection"
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
POST https://httpbin.org/post200 OKBody received · 36 bytesCompleted in 131msNo cookies captured.
No execution results.
| Key | Value |
|---|---|
| Content-Type | application/xml |
| Accept | application/json |
No query parameters.
No path parameters.
<message>
<to>Ada</to>
<text>Hello from Noodle</text>
</message>
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"data": "<message>\n <to>Ada</to>\n <text>Hello from Noodle</text>\n</message>"
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
POST https://httpbin.org/post200 OKBody received · 87 bytesCompleted in 114msNo cookies captured.
No execution results.
No request headers.
| Key | Value |
|---|---|
| theme | noodle |
| locale | en-US |
| timezone | UTC |
No path parameters.
This GET request has no body.
No response assertions.
No response captures.
Write inline or use a .js file.
No pre-request script.
Write inline or use a .js file.
No post-response script.
Write inline or use a .js file.
No scripted tests.
Set maximum time to wait before aborting the request
Automatically follow HTTP redirects
Maximum number of redirects to follow
Verify the server certificate, or inherit the collection setting
Send cookies from the collection cookie jar
{
"cookies": {
"theme": "noodle",
"locale": "en-US",
"timezone": "UTC"
}
}
| Key | Value |
|---|---|
| content-type | application/json; charset=utf-8 |
| cache-control | no-cache |
Illustrative network timings
GET https://httpbin.org/cookies/set?theme=noodle&locale=en-US&timezone=UTC200 OKBody received · 90 bytesCompleted in 143ms| Name | Value | Domain / Path |
|---|---|---|
| theme | noodle | httpbin.org/ |
| locale | en-US | httpbin.org/ |
| timezone | UTC | httpbin.org/ |
No execution results.
Shortcuts from the Noodle app. Expand, copy, and send work in this demo. Other commands are shown for reference and disabled.
Stay in the terminal and keep your hands on the keyboard.
Keep requests and environments readable beside your code.
Use the same collection from the TUI, CLI, scripts, CI, and agents.
Every request is a readable YAML file. Edit it in Noodle or your editor, review it in Git, and keep it beside the code it exercises.
name: Get user
method: GET
url: "$base_url/users/:id"
headers:
Accept: application/json
params:
id: 42Compose a request, send it, then move through body, headers, cookies, and timing from the same keyboard-first workspace.
{
"id": 42,
"name": "Ada Lovelace",
"role": "developer"
}Switch between development, staging, and production variables. Secret declarations stay in the file while values live in the OS credential vault or process environment.
API_TOKENOS credential vaultExplore interactively in the TUI, chain captured response values across ordered runs, enforce response assertions, or give coding agents the supported Noodle skill.
noodle collection run ./api --env staging --jsonnoodle agent installFocused enough to stay fast, complete enough to handle real API work.
URL, params, headers, body, and auth
Text, image previews, binary downloads, headers, cookies, and results
Folders, inherited context, and Git-friendly files
Switchable variables and secure values
Inline pre/post processing, seeded test data, and explicit persistence
Proxy, TLS, mTLS, and authentication
Import OpenAPI, Swagger, Postman, and Insomnia. Export OpenAPI and Postman.
Response assertions, scripted tests, and JSON Schema validation
Ordered runs, tag filters, and CSV or JSON iteration data
Capture response values and reuse them in later requests
Headless CLI runs, CI exit codes, and structured JSON results
Search and explore JSON or XML responses as trees and tables
Planned directions, clearly separated from what Noodle ships today.
Install Noodle and open your first collection.
curl -LsSf https://noodlerest.dev/install.sh | sh