How do I use the API to access protected custom data in a hook?
I followed @xavier's answer, but I'm posting what I did in case it's useful to others.

See the code below. The '25' is a magic number for this Custom Field, and can be found using the CiviCRM API Explorer. The foreach loop finds the right result among those returned (even though I specify Custom Field '25' I get results for other fields).

function xxxxxx_civicrm_post( $op, $objectName, $id, &amp;$params )
{
  if ($objectName == 'Participant') {
    switch ($op) {
      case 'create':
        $custom_values = civicrm_api3('CustomValue', 'get', array(
            'sequential' =&gt; 1,
            'entity_id' =&gt; $params-&gt;event_id,
            'entity_table' =&gt; 'civicrm_event',
            'id' =&gt; 25,
        ));

        $id = null;
        foreach ($custom_values['values'] as $custom_value) {
          if (isset($custom_value['latest'])
              &amp;&amp; isset($custom_value['id'])
              &amp;&amp; $custom_value['id'] = '25') {
            $id = (int) $custom_value['latest'];
            break;
          }
        }

        if ( ! isset($id) ) {
          break;
        }

        /* Use the $id */
        break;
    }
  } 
}