Skip to contentSkip to navigationSkip to topbar
Rate this page:
On this page

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. **

(information)

Info

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 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 TwilioTaskRouterServlet to accept a reservation with our web server. Remember to substitute your own account details in place of the curly braces.


TwilioTaskRouterServlet.java

twiliotaskrouterservletjava page anchor

_66
import java.io.IOException;
_66
_66
import javax.servlet.http.HttpServlet;
_66
import javax.servlet.http.HttpServletRequest;
_66
import javax.servlet.http.HttpServletResponse;
_66
_66
import com.twilio.Twilio;
_66
import com.twilio.rest.taskrouter.v1.workspace.Task;
_66
import com.twilio.rest.taskrouter.v1.workspace.task.Reservation;
_66
_66
public class TwilioTaskRouterServlet extends HttpServlet {
_66
_66
private String accountSid;
_66
private String authToken;
_66
private String workspaceSid;
_66
private String workflowSid;
_66
_66
@Override
_66
public void init() {
_66
accountSid = this.getServletConfig().getInitParameter("AccountSid");
_66
authToken = this.getServletConfig().getInitParameter("AuthToken");
_66
workspaceSid = this.getServletConfig().getInitParameter("WorkspaceSid");
_66
workflowSid = this.getServletConfig().getInitParameter("WorkflowSid");
_66
_66
Twilio.init(accountSid, authToken);
_66
}
_66
_66
// service() responds to both GET and POST requests.
_66
// You can also use doGet() or doPost()
_66
@Override
_66
public void service(final HttpServletRequest request, final HttpServletResponse response)
_66
throws IOException {
_66
if (request.getPathInfo() == null || request.getPathInfo().isEmpty()) {
_66
return;
_66
}
_66
_66
if (request.getPathInfo().equals("/assignment_callback")) {
_66
response.setContentType("application/json");
_66
response.getWriter().print("{}");
_66
} else if (request.getPathInfo().equals("/create_task")) {
_66
response.setContentType("application/json");
_66
response.getWriter().print(createTask());
_66
} else if (request.getPathInfo().equals("/accept_reservation")) {
_66
response.setContentType("application/json");
_66
final String taskSid = request.getParameter("TaskSid");
_66
final String reservationSid = request.getParameter("ReservationSid");
_66
response.getWriter().print(acceptReservation(taskSid, reservationSid));
_66
}
_66
}
_66
_66
public String createTask() {
_66
String attributes = "{\"selected_language\":\"es\"}";
_66
_66
Task task = Task.creator(workspaceSid, attributes, workflowSid).create();
_66
_66
return "{\"task_sid\":\"" + task.getSid() + "\"}";
_66
}
_66
_66
public String acceptReservation(final String taskSid, final String reservationSid) {
_66
Reservation reservation = Reservation.updater(workspaceSid, taskSid, reservationSid)
_66
.setReservationStatus(Reservation.Status.ACCEPTED)
_66
.update();
_66
_66
return "{\"worker_name\":\"" + reservation.getWorkerName() + "\"}";
_66
}
_66
}

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


_10
curl https://taskrouter.twilio.com/v1/Workspaces/{WorkspaceSid}/Tasks/{TaskSid}/Reservations/{ReservationSid} \
_10
-d ReservationStatus=accepted \
_10
-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 Worker Alice:


_10
{... "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 occurring, you can increase the 'Task Reservation Timeout' value in your Workflow configuration.

With your Workspace open in the TaskRouter web portal(link takes you to an external page), 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":

Alice has been transitioned to the Busy Activity.

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 »

** If you're not using ngrok or a similar tool, you can modify assignment.php to print the value of ReservationSid to your web server log. Or, you can use the Tasks REST API instance resource to look up the ReservationSid based on the TaskSid.


Rate this page: