# Creating Tasks and Accepting Reservations: Accept a Reservation using the REST API

To indicate that a Worker has accepted or rejected a Task, you make an HTTP\
`POST` request to a Reservation instance resource. To do that, we need the\
TaskSid, which is available via the web portal, and the ReservationSid. The\
ReservationSid was passed to our Assignment Callback URL when a Worker was\
reserved for our Task. Using the ngrok inspector page at `http://localhost:4040`, we can easily find the request parameters sent from\
TaskRouter and copy the ReservationSid to our clipboard. \*\*

> \[!NOTE]
>
> The Reservation API resource is ephemeral and exists only within the context of a Task. As such, it doesn't have its own primary API resource and you'll find it documented in the [Tasks](/docs/taskrouter/api/task) resource section of the reference documentation.

With our trusty TaskSid and ReservationSid in hand, let's make another REST API request to accept our Task Reservation. We'll add on to our server.rb to accept a reservation with our web server. Remember to substitute your own account details in place of the curly braces.

server.rb

```ruby
require 'rubygems'
require 'twilio-ruby'
require 'sinatra'
require 'json'
set :port, 8080

# Get your Account Sid and Auth Token from twilio.com/user/account
account_sid = '{{ account_sid }}'
auth_token = '{{ auth_token }}'
workspace_sid = '{{ workspace_sid }}'
workflow_sid = '{{ workflow_sid }}'

client = Twilio::REST::Client.new(account_sid, auth_token)

post '/assignment_callback' do
# Respond to assignment callbacks with empty 200 response
content_type :json
{}.to_json
end

get '/create-task' do
# Create a task
task = client.taskrouter.workspaces(workspace_sid)
.tasks
.create(
attributes: {
'selected_language' => 'es'
}.to_json,
workflow_sid: workflow_sid
)
task.attributes
end

get '/accept-reservation' do
# Accept a Reservation
task_sid = params[:task_sid]
reservation_sid = params[:reservation_sid]

reservation = client.taskrouter.workspaces(workspace_sid)
.tasks(task_sid)
.reservations(reservation_sid)
.update(reservation_status: 'accepted')
reservation.worker_name
end
```

If you'd like to use curl instead, put the following into your terminal:

```bash
curl https://taskrouter.twilio.com/v1/Workspaces/{WorkspaceSid}/Tasks/{TaskSid}/Reservations/{ReservationSid} \
-d ReservationStatus=accepted \
-u {AccountSid}:{AuthToken}
```

Examining the response from TaskRouter, we see that the Task Reservation has been accepted, and the Task has been assigned to the our Worker Alice:

```json
{... "worker_name": "Alice", "reservation_status": "accepted", ...}
```

*If you don't see this, it's possible that your Reservation has timed out. If this is the case, set your Worker back to an available Activity state and create another Task. To prevent this from occurring, you can increase the 'Task Reservation Timeout' value in your Workflow configuration.*

With your Workspace open in the [TaskRouter console](https://www.twilio.com/console/taskrouter/workspaces), click 'Workers' and you'll see that Alice has been transitioned to the 'Assignment Activity' of the TaskQueue that assigned the Task. In this case, "Busy":

![Worker Alice is busy with attributes showing languages English and Spanish.](https://docs-resources.prod.twilio.com/3d07ee5c4759311f5224c2ec9effeff409932b53fb978e33a870e3fbac058f2e.png)

Hurrah! We've made it to the end of the Task lifecycle:

*Task Created → eligible Worker becomes available → Worker reserved → Reservation accepted → **Task assigned to Worker**.*

In the next steps, we'll examine more ways to perform common Task acceptance and rejection workflows.

[Next: Accept a Reservation using Assignment Instructions »](/docs/taskrouter/quickstart/ruby/reservations-accept-callback)

\*\* *If you're not using* ngrok *or a similar tool, you can modify server.rb to print the value of* ReservationSid *to your web server log. Or, you can use the [Tasks REST API](/docs/taskrouter/api/task) instance resource to look up the* ReservationSid *based on the* TaskSid.
