---
title: "Creating requests — Requests for Laravel | Roundly"
description: "Build and save requests fluently with Requests::make() — author, type, meta, approvers and expiry in one chain."
url: https://roundly-consulting.com/open-source/docs/requests-for-laravel/creating-requests
language: en
---

[All packages](https://roundly-consulting.com/open-source.md)

[Requests for Laravel](https://roundly-consulting.com/open-source/docs/requests-for-laravel.md)

# Creating requests

The Requests facade is the discoverable entry point. The fully-qualified RoundlyConsulting\\Requests\\Facades\\Requests always works; a short Requests alias is also registered when the name is free:

```php
use RoundlyConsulting\Requests\Facades\Requests;

$request = Requests::make()
    ->author($user)
    ->type('Claim')
    ->title('Expense reimbursement')
    ->description('Travel costs for the client visit.')
    ->meta(['ip' => request()->ip()])
    ->requireApprovalsFrom([$alice, $bob])   // saved approver models — only they may decide
    ->expiresAt(now()->addDays(7))
    ->create();
```

create() saves the request, associates the author, opens the approval flow when approvers, stages or a workflow are given, and dispatches RequestCreated. requireApprovalsFrom() accepts a saved model or a list of them — only they, or their delegates, may decide, and their keys are recorded in require\_approvals\_from. A bare id is refused with InvalidApprover. The request and its approval round are written together, so a round that can’t open leaves no request behind.

## Builder reference

| Method | Sets |
| --- | --- |
| `author(?Model)` | The polymorphic author. |
| `type(?string)` | The request type, e.g. Claim. |
| `title(?string)` | The title. |
| `description(?string)` | The description. |
| `meta(iterable)` | Free-form metadata, stored as a Collection. |
| `status(Status)` | The initial status (default New). |
| `requireApprovalsFrom(Model\|iterable)` | The declared approvers — saved models only (a bare id throws InvalidApprover); only they, or their delegates, may decide. |
| `rule(ApprovalRule)` | Unanimous (default), Quorum, Any or Weighted. |
| `quorum(?int)` | The quorum / weight threshold for Quorum and Weighted. |
| `stages(array)` | An ad-hoc sequential pipeline of StageDefinition objects. |
| `rejectOnStageRejection(bool)` | Whether a rejected stage rejects the whole request (default true). |
| `workflow(?string)` | A named preset from config('approvals.workflows'). |
| `stageApprovers(array)` | One approver group per stage, for a staged preset. |
| `expiresAt(?CarbonInterface)` | The expiry deadline (overrides default\_ttl). |
| `toDto()` | Returns the assembled CreateRequestDto without saving. |
| `create()` | Terminal — saves the request, opens the approval flow and returns the Request. |

## Requests without approvers

Declaring approvers is optional. Without them no approval request is opened, and the first approve or reject resolves the request immediately:

```php
// No approvers declared — the first decision resolves the request.
$request = Requests::make()
    ->author($user)
    ->type('AccessRequest')
    ->title('Access to the billing dashboard')
    ->create();
```

## Building the DTO only

toDto() returns the assembled CreateRequestDto without saving — handy for queueing or for passing to the manager later:

```php
// Build the DTO without persisting, then hand it to the manager.
$dto = Requests::make()
    ->author($user)
    ->title('Expense reimbursement')
    ->toDto();

$request = Requests::create($dto);
```

## Expiry

expiresAt() stamps a deadline on the request. Without it, requests.default\_ttl (in minutes) applies when set; otherwise the request never expires on its own (Cancel & expire). The approval round opened with the request — flat, staged or from a workflow preset — carries the same deadline, so the engine stops taking decisions exactly when the request lapses.

## Show your open-source love

This package is free and MIT-licensed. If it saves you time, a one-off donation or a Patreon membership keeps it maintained, tested and documented.

[More ways to support, including crypto](https://roundly-consulting.com/support-us.md)

By donating, you agree to our [donation terms](https://roundly-consulting.com/donation-terms.md).

[Support our open source work (opens in a new tab)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Join us on Patreon (opens in a new tab)](https://www.patreon.com/cw/roundly)

## Want this built into your product?

We integrate our packages into custom Laravel and AI builds. Tell us what you're working on and we'll reply within 48 hours.

[Get a quote in 48 hours](https://roundly-consulting.com/contact.md) [Browse all packages](https://roundly-consulting.com/open-source/docs/requests-for-laravel.md)
