Manage, test and connect public and private endpoints. Run APIs without code. Learn more
- Store API requests, including the url, headers, query, and body values.
- Store credentials and payloads in storage for templating during workflow runtime.
- Supports queueing, scheduling, and returning results immediately.
- Configure custom API workflows to pass information between requests.
- Trigger workflows from the Dashboard, REST API and NPM Library.
- Accept incoming workflow payloads.
- Send a webhook after workflow completion.
- View upcoming workflow schedule and past workflow instances.
- Cancel upcoming and scheduled workflows before they run.
- Return workflow results in JSON or set-and-forget requests (with webhooks).
- Generate API tokens to access workflows and services from any application.
- Invite users to collaborate on projects.
- Define team member permissions.
- Lock shared API resources.
- Redact sensitive request data.
- Works seamlessly with Postman.
Using npm:
$ npm install request-workbox
Request Workbox was created to provide tooling for REST APIs, such as managing parameters, permission based responses, team access, and options for running and monitoring multiple requests and workflows concurrently (with queuing and scheduling).
You can chain requests into workflows, and configure the options for each request using storage data, incoming payloads or response data from an any other request in the workflow. The system is optimized for text and JSON data, which allows users with any backend configuration (or Postman) to integrate seamlessly.
Trigger workflows and receive results immediately, or send the results to a different endpoint on completion or error. All features are available from the browser dashboard, REST API and NPM Library.
There are no monthly subscriptions. No monthly fees. Creating an account is free and payments are pay as you go. Every project includes 5 requests per minute and 1GB of data transfer free.
Type | Description | Price | Per |
---|---|---|---|
Free project | 5 requests/min | Free | project |
Standard upgrade | 15 requests/min | $10 | project |
Developer upgrade | 50 requests/min | $25 | project |
Professional upgrade | 250 requests/min | $50 | project |
Data transfer | 1 GB | $3 | project |
Product Hunt promo: free standard upgrade. Use promo code PRODUCTHUNT.
If you work with APIs, or are a UI/UX nerd, or have any similar interest in the product, I would love to get your feedback. Reach out to support and I’ll send you a data transfer credit to get you started.
Let me know if you have any questions or issues, I’d be delighted to help. I take your privacy seriously, and can export or delete all of your data at any point in time. You can reach me at [email protected]. Sign up today.
Accepts an API Key and project id. Subsequent requests are tied to the same project. Responses are permission based. Do not share your API keys with team members or anyone else. Members can access your project (after accepting your invitation) with their own API keys. You can invite a user to your project within the dashboard.
const requestWorkbox = require('request-workbox')
const RequestWorkbox = requestWorkbox({
apiKey: '4DDFE1ADF0064EA88B4D7111D8E2FC55',
projectId: '5fc455ce1924bd02bf49d28f',
})
const requestResults = await RequestWorkbox.Request.startRequest({
requestId: '5fc726bd1684be02dc49e48d',
workflowType: 'return',
})
const { queueId, instanceId } = await RequestWorkbox.Request.startRequest({
requestId: '5fc726bd1684be02dc49e48d',
workflowType: 'queue', // queue, schedule
})
const workflowResults = await RequestWorkbox.Workflow.startWorkflow({
workflowId: '5fc726bd9834be02d99ee48d',
workflowType: 'return',
})
const { queueId, instanceId } = await RequestWorkbox.Workflow.startWorkflow({
workflowId: '5fc726bd9834be02d99ee48d',
workflowType: 'queue', // queue, schedule
})
Queue and Schedule workflows return a queue id and instance id (after initialization). The results are sent to the first request listed in Workflow.webhooks
. Error responses break the workflow chain, but still trigger a webhook containing the successful request results.
Creates and returns a new project.
// POST https://api.requestworkbox.com/create-project
const project = await RequestWorkbox.Project.createProject()
List projects you own.
// POST https://api.requestworkbox.com/list-projects
const projects = await RequestWorkbox.Project.listProjects()
List projects you are a member of.
// POST https://api.requestworkbox.com/list-team-projects
const teamProjects = await RequestWorkbox.Project.listTeamProjects()
Returns an existing project. Requires read permission.
// POST https://api.requestworkbox.com/get-project
const project = await RequestWorkbox.Project.getProject({
projectId: '5fc455ce1924bd02bf49d28f',
})
Option | Required | Description |
---|---|---|
projectId | Yes | Project id. |
Update project name and permissions. Owner only access. Returns updated project.
// POST https://api.requestworkbox.com/update-project
const project = await RequestWorkbox.Project.updateProject({
_id: '5fc455ce1924bd02bf49d28f',
name: 'Email Endpoints',
})
Option | Required | Description |
---|---|---|
_id | Yes | Project id. |
name | Optional | Project name. |
returnRequest | Optional | Return request permission. |
queueRequest | Optional | Queue request permission. |
scheduleRequest | Optional | Schedule request permission. |
returnWorkflow | Optional | Return workflow permisssion. |
queueWorkflow | Optional | Queue workflow permission. |
scheduleWorkflow | Optional | Schedule workflow permission. |
Archives a project. Owner only access. Returns updated project.
// POST https://api.requestworkbox.com/archive-project
const project = await RequestWorkbox.Project.archiveProject({
projectId: '5fc455ce1924bd02bf49d28f',
})
Option | Required | Description |
---|---|---|
projectId | Yes | Project id. |
Restores a project. Owner only access. Returns updated project.
// POST https://api.requestworkbox.com/restore-project
const project = await RequestWorkbox.Project.restoreProject({
projectId: '5fc455ce1924bd02bf49d28f',
})
Option | Required | Description |
---|---|---|
projectId | Yes | Project id. |
Creates and returns a new request. Requires write permission.
// POST https://api.requestworkbox.com/create-request
const request = await RequestWorkbox.Request.createRequest({
projectId: '5fc455ce1924bd02bf49d28f',
})
Option | Required | Description |
---|---|---|
projectId | Yes | Project id. |
List requests for a given project. Requires read permission.
// POST https://api.requestworkbox.com/list-request
const requests = await RequestWorkbox.Request.listRequests({
projectId: '5fc455ce1924bd02bf49d28f',
})
Option | Required | Description |
---|---|---|
projectId | Yes | Project id. |
Returns an existing request. Requires read permission.
// POST https://api.requestworkbox.com/get-request
const request = await RequestWorkbox.Request.getRequest({
requestId: '5fc726bd1684be02dc49e48d',
})
Option | Required | Description |
---|---|---|
requestId | Yes | Request id. |
projectId | Optional | Project id. |
Saves request changes. Requires write permission. Returns updated request.
// POST https://api.requestworkbox.com/save-request-changes
const request = await RequestWorkbox.Request.saveRequestChanges({
_id: '5fc726bd1684be02dc49e48d',
name: 'Send customer email',
url: 'https://domain.com/send-customer-email',
method: 'POST',
})
Option | Required | Description |
---|---|---|
_id | Yes | Request id. |
name | Optional | Request name. |
url | Optional | HTTPS URL. |
method | Optional | HTTP request method. |
authorizationType | Optional | Authorization type. |
authorization | Optional | Request authorization. |
query | Optional | Request query. |
headers | Optional | Request headers. |
query | Optional | Request query. |
body | Optional | Request body. |
lockedResource | Optional | Locked resource option. |
preventExecution | Optional | Prevent execution option. |
sensitiveResponse | Optional | Senstive response option. |
Pushes an option to the request header, query, or body. Requires write permission. Returns updated request.
// POST https://api.requestworkbox.com/add-request-detail-item
const request = await RequestWorkbox.Request.addRequestDetailItem({
_id: '5fc726bd1684be02dc49e48d',
requestDetailOption: 'headers'
})
Option | Required | Description |
---|---|---|
_id | Yes | Request id. |
requestDetailOption | Yes | Request detail option. |
Removes an option from the request header, query, or body. Requires write permission. Returns updated request.
// POST https://api.requestworkbox.com/delete-request-detail-item
const request = await RequestWorkbox.Request.deleteRequestDetailItem({
_id: '5fc726bd1684be02dc49e48d',
requestDetailOption: 'query'
requestDetailItemId: '5fc726iu36849db2dc4ed38d'
})
Option | Required | Description |
---|---|---|
_id | Yes | Request id. |
requestDetailOption | Yes | Request detail option. |
requestDetailItemId | Yes | Existing request detail item id. |
Archive request. Owner only access. Returns updated request.
// POST https://api.requestworkbox.com/archive-request
const request = await RequestWorkbox.Request.archiveRequest({
requestId: '5fc726bd1684be02dc49e48d',
})
Option | Required | Description |
---|---|---|
requestId | Yes | Request id. |
Restore request. Owner only access. Returns updated request.
// POST https://api.requestworkbox.com/restore-request
const request = await RequestWorkbox.Request.restoreRequest({
requestId: '5fc726bd1684be02dc49e48d',
})
Option | Required | Description |
---|---|---|
requestId | Yes | Request id. |
Trigger a dedicated request workflow. Permission based access. Returns workflow results.
// POST https://api.requestworkbox.com/restore-request
const request = await RequestWorkbox.Request.restoreRequest({
requestId: '5fc726bd1684be02dc49e48d',
})
Option | Required | Description |
---|---|---|
requestId | Yes | Request id. |
Creates and returns a new workflow. Requires write permission.
// POST https://api.requestworkbox.com/create-workflow
const workflow = await RequestWorkbox.Workflow.createWorkflow({
projectId: '5fc455ce1924bd02bf49d28f',
})
Option | Required | Description |
---|---|---|
projectId | Yes | Project id. |
List workflows for a given project. Requires read permission.
// POST https://api.requestworkbox.com/list-workflows
const workflows = await RequestWorkbox.Workflow.listWorkflows({
projectId: '5fc455ce1924bd02bf49d28f', // defaults to initialized value
})
Option | Required | Description |
---|---|---|
projectId | Yes | Project id. |
Returns an existing workflow. Requires read permission.
// POST https://api.requestworkbox.com/get-workflow
const workflow = await RequestWorkbox.Workflow.getWorkflow({
workflowId: '5fc726bd9834be02d99ee48d',
})
Option | Required | Description |
---|---|---|
workflowId | Yes | Workflow id. |
projectId | Optional | Project id. |
Saves workflow changes. Requires write permission. Returns updated workflow.
// POST https://api.requestworkbox.com/save-workflow-changes
const workflow = await RequestWorkbox.Workflow.saveWorkflowChanges({
_id: '5fc726bd9834be02d99ee48d', // workflowId
name: 'Daily email workflow',
})
Option | Required | Description |
---|---|---|
_id | Yes | Workflow id. |
name | Optional | Workflow task array. |
payloads | Optional | Workflow task array. |
tasks | Optional | Workflow task array. |
webhooks | Optional | Workflow task array. |
lockedResource | Optional | Prevent changes. |
preventExecution | Optional | Prevent execution. |
Adds a task to the workflow chain at Workflow.tasks
. Requires write permission. Returns updated workflow.
// POST https://api.requestworkbox.com/add-workflow-task
const workflow = await RequestWorkbox.Workflow.addWorkflowTask({
_id: '5fc726bd9834be02d99ee48d',
})
Option | Required | Description |
---|---|---|
_id | Yes | Workflow id. |
Delete request (task) from the workflow chain. Requires write permission. Returns updated workflow.
// POST https://api.requestworkbox.com/delete-workflow-task
const workflow = await RequestWorkbox.Workflow.deleteWorkflowTask({
_id: '5fc726bd9834be02d99ee48d',
taskId: '5fc726bd4534eb02d99ff48d',
})
Option | Required | Description |
---|---|---|
_id | Yes | Workflow id. |
taskId | Yes | Workflow task id. |
Archive workflow. Owner only access. Returns updated workflow.
// POST https://api.requestworkbox.com/archive-workflow
const workflow = await RequestWorkbox.Workflow.archiveWorkflow({
workflowId: '5fc726bd9834be02d99ee48d',
})
Option | Required | Description |
---|---|---|
workflowId | Yes | Workflow id. |
Restore workflow. Owner only access. Returns updated workflow.
// POST https://api.requestworkbox.com/restore-workflow
const workflow = await RequestWorkbox.Workflow.restoreWorkflow({
workflowId: '5fc726bd9834be02d99ee48d',
})
Option | Required | Description |
---|---|---|
workflowId | Yes | Workflow id. |
Creates and returns a new storage. Requires write permission.
// POST https://api.requestworkbox.com/create-storage
const storage = await RequestWorkbox.Storage.createStorage({
projectId: '5fc455ce1924bd02bf49d28f',
storageType: 'text',
})
Option | Required | Description |
---|---|---|
projectId | Yes | Project id. |
storageType | Yes | Storage type. |
List storages for a given project. Requires read permission.
// POST https://api.requestworkbox.com/list-storages
const storages = await RequestWorkbox.Storage.listStorages({
projectId: '5fc455ce1924bd02bf49d28f',
})
Option | Required | Description |
---|---|---|
projectId | Yes | Workflow id. |
Returns an existing storage. Requires read permission.
// POST https://api.requestworkbox.com/get-storage
const storage = await RequestWorkbox.Storage.getStorage({
storageId: '5fc726bd873fe02d99dd18f',
})
Option | Required | Description |
---|---|---|
storageId | Yes | Storage id. |
projectId | Optional | Project id. |
Saves storage changes. Requires write permission. Returns updated storage.
// POST https://api.requestworkbox.com/save-storage-changes
const storage = await RequestWorkbox.Storage.saveStorageChanges({
_id: '5fc726bd873fe02d99dd18f',
name: 'Mailchimp API Key',
})
Option | Required | Description |
---|---|---|
_id | Yes | Storage id. |
name | Optional | Storage name. |
lockedResource | Optional | Prevent changes. |
preventExecution | Optional | Prevent execution. |
sensitiveResponse | Optional | Redacts public response. |
Archive storage. Owner only access. Returns updated storage.
// POST https://api.requestworkbox.com/archive-storage
const storage = await RequestWorkbox.Storage.archiveStorage({
storageId: '5fc726bd873fe02d99dd18f',
})
Option | Required | Description |
---|---|---|
storageId | Yes | Storage id. |
Restore storage. Owner only access. Returns updated storage.
// POST https://api.requestworkbox.com/restore-storage
const storage = await RequestWorkbox.Storage.restoreStorage({
storageId: '5fc726bd873fe02d99dd18f',
})
Option | Required | Description |
---|---|---|
storageId | Yes | Storage id. |
Retreive storage value. Requires write permissions, or read permissions if data returns sensitive response and user has includeSensitive permission. Returns storage and storage value.
// POST https://api.requestworkbox.com/get-text-storage-data
const storage = await RequestWorkbox.Storage.getTextStorageData({
storageId: '5fc726bd873fe02d99dd18f',
})
Option | Required | Description |
---|---|---|
storageId | Yes | Storage id. |
projectId | Optional | Project id. |
Returns storage and usage. Requires read permissions.
// POST https://api.requestworkbox.com/get-storage-usage
const storage = await RequestWorkbox.Storage.getStorageUsage({
storageId: '5fc726bd873fe02d99dd18f',
})
Option | Required | Description |
---|---|---|
storageId | Yes | Storage id. |
projectId | Optional | Project id. |
Update text storage value. Requires write permission. Returns updated storage and value.
// POST https://api.requestworkbox.com/update-text-storage-data
const storage = await RequestWorkbox.Storage.updateTextStorageData({
storageId: '5fc726bd873fe02d99dd18f',
storageValue: 'AEF032-AF7631-S520495E',
})
Option | Required | Description |
---|---|---|
storageId | Yes | Storage id. |
storageValue | Yes | Storage value. 1MB max. |
projectId | Optional | Project id. |
List queues for a given workflow from start to end of day (in UTC). Requires read permission.
// POST https://api.requestworkbox.com/list-queues
const queues = await RequestWorkbox.Queue.listQueues({
workflowId: '5fc726bd9834be02d99ee48d',
})
Option | Required | Description |
---|---|---|
workflowId | Yes | Workflow id. |
date | Optional | ISO 8601 date. |
Archive queue. Owner only access. Returns updated queue.
// POST https://api.requestworkbox.com/archive-queue
const queue = await RequestWorkbox.Queue.archiveQueue({
queueId: '5fc72e6d3884be02e11fd48d',
})
Option | Required | Description |
---|---|---|
queueId | Yes | Queue id. |
Archive all queues for a given workflow and queue type. Only includes queues from start to end of day (in UTC). Owner only access. Returns updated queues.
// POST https://api.requestworkbox.com/archive-all-queues
const queues = await RequestWorkbox.Queue.archiveAllQueues({
workflowId: '5fc726bd9834be02d99ee48d',
})
Option | Required | Description |
---|---|---|
workflowId | Yes | Workflow id. |
date | Optional | ISO 8601 date. |
queueType | Optional | Queue type. |
List instances for a given project. Requires read permission.
// POST https://api.requestworkbox.com/list-instances
const instances = await RequestWorkbox.Instance.listInstances({
projectId: '5fc455ce1924bd02bf49d28f',
})
Option | Required | Description |
---|---|---|
projectId | Yes | Project id. |
Returns an existing instance. Requires read permission.
// POST https://api.requestworkbox.com/get-instance
const instance = await RequestWorkbox.Instance.getInstance({
instanceId: '5fc146db473fee8d98bd1de',
})
Option | Required | Description |
---|---|---|
instanceId | Yes | Instance id. |
projectId | Optional | Project id. |
Returns instance stat details. Requires write permission. Returns instance with usage.
// POST https://api.requestworkbox.com/get-instance-detail
const instanceDetail = await RequestWorkbox.Instance.getInstanceDetail({
instanceId: '5fc146db473fee8d98bd1de',
})
Option | Required | Description |
---|---|---|
instanceId | Yes | Instance id. |
projectId | Optional | Project id. |
Returns instance details (results without sensitive data). Requires write permission or read permission with includeSensitive permission.
// POST https://api.requestworkbox.com/get-instance-detail
const instanceDetail = await RequestWorkbox.Instance.getInstanceDetail({
instanceId: '5fc146db473fee8d98bd1de',
})
Option | Required | Description |
---|---|---|
instanceId | Yes | Instance id. |
projectId | Optional | Project id. |
Returns instance usage. Requires write permission..
// POST https://api.requestworkbox.com/get-instance-detail
const instanceDetail = await RequestWorkbox.Instance.getInstanceUsage({
instanceId: '5fc146db473fee8d98bd1de',
})
Option | Required | Description |
---|---|---|
instanceId | Yes | Instance id. |
projectId | Optional | Project id. |
Returns entire instance stat (including response data). Requires write permission, or read permission with includeSensitive permission if the stat returns a sensitive response.
// POST https://api.requestworkbox.com/download-instance-stat
const instanceStat = await RequestWorkbox.Instance.downloadInstanceStat({
instanceId: '5fc146db473fee8d98bd1de',
statId: '5fe146eeb73fee928ded3ee',
})
Option | Required | Description |
---|---|---|
instanceId | Yes | Instance id. |
statId | Yes | Stat id. |
projectId | Optional | Project id. |
{
_id, // projectId
active: true,
name: 'Untitled Project', // String
projectType: 'free', // free, standard, developer, professional
globalWorkflowStatus: 'running', // running, stopped, locked
returnRequest: 'owner', // owner, team, public
returnWorkflow: 'owner', // owner, team, public
queueRequest: 'owner', // owner, team, public
queueWorkflow: 'owner', // owner, team, public
scheduleRequest: 'owner', // owner, team, public
scheduleWorkflow: 'owner', // owner, team, public
workflowCount: 0,
workflowLast: new Date(),
usage: 0,
usageRemaining: 1000,
usageTotal: 1000, // MB
}
{
_id, // requestId
active: true,
name: 'Sample Request', // String
projectId: '5fc455ce1924bd02bf49d28f',
method: 'GET', // GET, POST
url: 'https://api.requestworkbox.com', // String
authorizationType: 'noAuth', // noAuth, basicAuth
authorization: [], // Request detail item schema
headers: [], // Request detail item schema
query: [], // Request detail item schema
body: [], // Request detail item schema
lockedResource: false, // Boolean
preventExecution: false, // Boolean
sensitiveResponse: false, // Boolean
}
// headers, query, body
{
_id, // requestDetailItemId
active: true, // Boolean
key: '', // String
value: '', // String - text value, storageId, runtimeResultName, incoming payload field
valueType: 'textInput', // textInput, storage, runtimeResult, incomingPayload
}
{
_id, // workflowId
active: true,
name: 'Untitled Workflow', // String
projectId: '5fc455ce1924bd02bf49d28f',
workflowType: 'workflow', // request, workflow
payloads: [], // Workflow task schema
tasks: [], // Workflow task schema
webhooks: [], // Workflow task schema
lockedResource: false, // Boolean
preventExecution: false, // Boolean
}
// payloads, tasks, webhooks
{
_id, // taskId
active: true, // Boolean
requestId: '5fc726bd1684be02dc49e48d', - webhooks only
runtimeResultName: '', // String - tasks only
}
{
_id, // storageId
active: true,
name: 'Untitled Storage', // String
projectId: '5fc455ce1924bd02bf49d28f',
storageType: 'text', // text, file
storageValue: {}, // text or JSON data
mimetype: '',
originalname: '',
size: 0,
totalBytesDown: 0,
totalBytesUp: 0,
totalMs: 0,
lockedResource: false, // Boolean
preventExecution: false, // Boolean
sensitiveResponse: false, // Boolean
usage: [], // Usage schema
}
{
_id, // queueId
active: true,
projectId: '5fc455ce1924bd02bf49d28f',
instanceId: '5fc146db473fee8d98bd1de',
workflowId: '5fc726bd9834be02d99ee48d',
workflowName: 'Daily email workflow'
workflowType: 'workflow',
status: 'received', // pending, queued, uploading, starting, initializing, loading, running, webhook, complete, error, archived
queueType: 'return', // return, queue, schedule
date: new Date(), // workflow start time
storageInstanceId: '', //
ipAddress: '',
publicUser: true,
stats: [], // Queue Stat schema
}
{
_id, // queueStatId
active: true,
queueId: '5fc72e6d3884be02e11fd48d',
instanceId: '5fc146db473fee8d98bd1de',
status: 'received', // pending, queued, uploading, starting, initializing, loading, running, webhook, complete, error, archived
statusText: '',
error: false,
}
The storage instance id will be an empty string or will contain the id of a storage reference when a custom payload is passed to a workflow.
{
_id, // instanceId
active: true,
projectId: '5fc455ce1924bd02bf49d28f',
queueId: '5fc72e6d3884be02e11fd48d',
queueType: 'return', // return, queue, schedule
workflowId: '5fc726bd9834be02d99ee48d',
workflowName: 'Daily email workflow'
workflowType: 'workflow',
totalBytesDown: 0,
totalBytesUp: 0,
totalMs: 0,
ipAddress: '',
publicUser: true,
stats: [], // Instance Stat schema
usage: [], // Usage Stat schema
}
{
_id, // statId
active: true,
instanceId: '5fc146db473fee8d98bd1de',
taskId: '5fc726bd4534eb02d99ff48d',
taskField: 'tasks', // tasks, payload, webhooks
requestName: 'Send customer email',
status: 200,
statusText: '',
requestType: 'request', // request, webhook
requestId: '5fc726bd1684be02dc49e48d',
requestPayload: {},
responsePayload: {},
startTime: new Date(),
endTime: new Date(),
duration: 0,
requestSize: 0,
responseSize: 0,
responseType: '',
error: false,
sensitiveResponse: false,
}
{
_id, // usageId
active: true,
usageId: '5fc726bd873fe02d99dd18f', // resource id
usageDetail: '', // usage description
usageType: 'request', // request, webhook, storage, stat
usageDirection: 'up', // up, down, time
usageAmount: 0,
usageLocation: 'api', // api, instance, queue
usageMeasurement: 'byte', // byte, ms
}
// lockedResource, preventExecution, sensitiveResponse
- This project is maintained by Zach Coss and hosted on AWS (part of the AWS Activate Founders program).
- If you like this project, have any suggestions, would like to partner, or need to report a security issue, please reach out to [email protected]. You can also use the Feedback button located within the dashboard.
- Backup and versioning (in development).
- Delete (in development). I take your privacy seriously, and can export or delete all of your data at any point in time. Reach out to [email protected].