These docs are for an old release. Info on upgrading to v5
edit doc

eventAllow

Exact programmatic control over where an event can be dropped.

function(dropInfo, draggedEvent)

After it has been determined that the eventOverlap and eventConstraint settings will allow the user to drop an event at a given position on the calendar, the eventAllow callback will be called. It will be called for every new potential droppable position as the user is dragging.

If specified, it must return either true or false as to whether the calendar will allow the given event (draggedEvent) to be dropped at the given location (dropInfo).

eventAllow: function(dropInfo, draggedEvent) {
  if (draggedEvent.id === '999') {
    return dropInfo.start < new Date(2016, 0, 1); // a boolean
  }
  else {
    return true;
  }
}

The dropInfo object has the following properties:

allDay

true or false whether the event was dropped on one of the all-day cells.

end

Date. The end of where the draggable event was dropped.

endStr

The ISO8601 string representation of the end of where the draggable event was dropped.

resource

If the current view is a resource-view, the Resource Object the element was dropped on. This requires one of the resource plugins.

start

Date. The beginning of where the draggable event was dropped.

startStr

The ISO8601 string representation of the start of where the draggable event was dropped.

In line with the discussion about the Event object, it is important to stress that the end date property is exclusive.

Resources

In addition to receiving information about which date the user is attempting to drop the event upon, it will also receive information about the resource:

eventAllow: function(dropInfo, draggedEvent) {
  return /^a/.test(dropInfo.resource.id); // starts with 'a' ?
}

Only available with the Scheduler plugin.