diff --git a/bakery.api.php b/bakery.api.php
new file mode 100644
index 0000000..d20c233
--- /dev/null
+++ b/bakery.api.php
@@ -0,0 +1,61 @@
+<?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 hook_user_presave().
+ * @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_update('example_table')
+      ->fields(array(
+        'example_field' => $cookie['example_field']
+        ))
+      ->execute();
+  }
+}
diff --git a/bakery.module b/bakery.module
index b98589a..e305c32 100644
--- a/bakery.module
+++ b/bakery.module
@@ -137,6 +137,10 @@ function bakery_user_logout($account) {
  */
 function bakery_user_presave(&$edit, $account, $category) {
   if (variable_get('bakery_is_master', 0)) {
+    // Invoke implementations of hook_bakery_transmit() for syncing arbitrary
+    // data.
+    $_SESSION['bakery']['data'] = module_invoke_all('bakery_transmit', $edit, $account, $category);
+
     // We store email/name if they changed. We want to wait with doing
     // anything else until the changes are saved locally.
     foreach (variable_get('bakery_supported_fields', array('mail' => 'mail', 'name' => 'name')) as $type => $enabled) {
@@ -1243,6 +1247,9 @@ function bakery_eat_stroopwafel_cookie() {
       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);
   }
 
   module_invoke_all('exit');
@@ -1372,6 +1379,8 @@ function bakery_request_account($name, $or_email = FALSE) {
   $account = user_save($account, $new_account);
   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;
   }
 
@@ -1430,6 +1439,11 @@ 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);
