diff --git a/bakery.api.php b/bakery.api.php
new file mode 100644
index 0000000..188fa3b
--- /dev/null
+++ b/bakery.api.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * @file
+ * This file contains no working PHP code; it exists to provide additional
+ * documentation for doxygen as well as to document hooks in the standard
+ * Drupal manner.
+ */
+
+/**
+ * @defgroup bakery Bakery module integrations.
+ *
+ * Module integrations with the Bakery SSO.
+ */
+
+/**
+ * Bakery data transmit hook invoked before data is sent to another site.
+ *
+ * Invoked on master during user_save before syncing to subsites. Also invoked
+ * on subsite when requesting account data from master for account creation.
+ *
+ * @param array $edit
+ *   The array of form values submitted by the user from user_save().
+ * @param object $account
+ *   User account object.
+ * @param string $category
+ *   The active category of user information being edited.
+ *
+ * @return
+ *   Keyed array of data to pass along to other sites.
+ */
+function hook_bakery_transmit($edit, $account, $category) {
+  return array(
+    'example_field' => 'example_value'
+  );
+}
+
+/**
+ * Bakery data receive hook invoked on response from data sync from master.
+ *
+ * Invoked on subsites after requesting account data from master for account
+ * creation. Also invoked on subsites during account data sync from master.
+ *
+ * Note, callers are responsible for data validation.
+ *
+ * @param object $account
+ *   User account object.
+ * @param array $cookie
+ *   Data sent from the master. Custom data sent by master's
+ *   hook_bakery_transmit() will be available as top-level elements.
+ *
+ */
+function hook_bakery_receive($account, $cookie) {
+  if (!empty($cookie['example_field'])) {
+    db_query("UPDATE {example_table} SET example_field = '%s'", array('%s' => $cookie['example_field']));
+  }
+}
diff --git a/bakery.module b/bakery.module
index f67237b..974de8e 100644
--- a/bakery.module
+++ b/bakery.module
@@ -121,6 +121,9 @@ function bakery_user($op, &$array, &$account, $category = NULL) {
     // We store email/name if they changed. We want to wait with doing
     // anything else until the changes are saved locally.
     $newly_saved_user = user_load($account->uid);
+    // Invoke implementations of hook_bakery_transmit() for syncing arbitrary
+    // data.
+    $_SESSION['bakery']['data'] = module_invoke_all('bakery_transmit', $array, $account, $category);
     foreach (variable_get('bakery_supported_fields', array('mail' => 'mail', 'name' => 'name')) as $type => $enabled) {
       // Profile fields are unset by this point so we have to get them from the DB and use whichever is populated.
       $value = isset($array[$type]) ? $array[$type] : $newly_saved_user->$type;
@@ -1222,6 +1225,8 @@ function bakery_eat_stroopwafel_cookie() {
     else {
       watchdog('bakery', 'user updated name %name_old to %name_new, mail %mail_old to %mail_new.', array('%name_old' => $account->name, '%name_new' => $stroopwafel['name'], '%mail_old' => $account->mail, '%mail_new' => $stroopwafel['mail']));
       $message = t('Successfully updated account on %slave.', array('%slave' => variable_get('site_name', '')));
+      // Invoke hook_bakery_receive().
+      module_invoke_all('bakery_receive', $account, $stroopwafel);
     }
   }
 
@@ -1394,6 +1399,8 @@ function bakery_request_account($name, $or_email = FALSE) {
   )));
   if ($account) {
     watchdog('bakery', 'Created account for @name', array('@name' => $name));
+    // Invoke hook_bakery_receive().
+    module_invoke_all('bakery_receive', $account, $cookie);
     return $account->uid;
   }
 
@@ -1452,6 +1459,9 @@ function bakery_eat_gingerbread_cookie() {
         $payload[$type] = $account->$type;
       }
     }
+    // Invoke implementations of hook_bakery_transmit() for syncing arbitrary
+    // data.
+    $payload['data'] = module_invoke_all('bakery_transmit', NULL, $account);
     $payload['timestamp'] = $_SERVER['REQUEST_TIME'];
     // Respond with encrypted and signed account information.
     $message = bakery_bake_data($payload);
