custom service respond me : 401 Unauthorized: Missing required argument foo
The problem is the mismatch between the data type you define for foo ('struct'), and what you pass with JavaScript (a string). If you are going to pass a string, then your hook implementation should be the following one.

function zbs_services_resources() {
  return array(
    'productQuestionForm' =&gt; array(
      'actions' =&gt; array(
        'send' =&gt; array(
          'help' =&gt; 'save a FOO entity via send form',
          'file' =&gt; array('file' =&gt; 'inc', 'module' =&gt; 'zbs'),
          'callback' =&gt; '_zbs_productQuestionForm_create',
          //'access arguments' =&gt; array('note resource create'),
          //'access arguments append' =&gt; FALSE,
          'args' =&gt; array(
              array(
                'name' =&gt; 'foo',
                'type' =&gt; 'string',
                'description' =&gt; 'The FOO to create',
                'source' =&gt; 'data',
                'optional' =&gt; false,
              ),
            ),
        ),
      )
    )
  );
}


'source' =&gt; 'data' is perfectly fine, as shown in the example at hook_services_resources(), but notice what the documentation says.


  In the case of 'data' unless you put things in an array, you will get passed to your functions. 'source' =&gt; array('data' =&gt; 'nid') will pass them off as a single variable; 'source' =&gt; array('data') will give you all argument values to each argument.