Google has an events API here
From the about events page:
A user can invite other users to an event by including them in the
attendees event property when inserting or updating the event. Each
attendee will see a copy of the event in their calendar. By setting
the sendNotifications parameter in the insert or update request to
true, the attendees will also receive an email notification. The user
that owns the original event is called the organizer of the event.
The attendee copy of the event has the same event ID as the organizer
copy, and most of its properties are identical, except for private
properties of the event such as event reminders, colorId,
transparency, or the extendedProperties.private property. Whenever the
organizer changes any of the shared properties, such as the event
start time, summary or location, the change is reflected in each
attendee's copy of the event. The attendees can also change the shared
properties of the event, but the changes are only reflected on the
attendee's own copy. The only event change that is propagated from the
attendees back to the organizer is the attendee's response status,
stored in the attendees[].responseStatus property.
The events.import method adds a private copy of an event to a given
calendar. No other users specified in the attendees[] or organizer
property will receive a copy of the event on their calendar.
The organizer of an event can be changed using the API method
events.move. The actor performing the method must have write access to
both the source and target calendars.
- Easily shared with Google users
- Can be published to plus.google.com
- Invite only or can add self, can also limit numbers,
- Integrates with google calendar