Webservice endpoint with hook_services_resources()
Example from the module itself, the child is defined in the relationships:

'events' =&gt; array(
  'operations' =&gt; array(
    'retrieve' =&gt; array(
      'file' =&gt; array('type' =&gt; 'inc', 'module' =&gt; 'services', 'name' =&gt; 'resources/node_resource'),
      'callback' =&gt; '_node_resource_retrieve',
      'args' =&gt; array(
        array(
          'name' =&gt; 'nid',
          'optional' =&gt; FALSE,
          'source' =&gt; array('path' =&gt; 0),
          'type' =&gt; 'int',
          'description' =&gt; 'The nid of the node to get',
        ),
      ),
      'access callback' =&gt; '_node_resource_access',
      'access arguments' =&gt; array('view'),
      'access arguments append' =&gt; TRUE,
    ),
    'create' =&gt; array(
      'file' =&gt; array('type' =&gt; 'inc', 'module' =&gt; 'services', 'name' =&gt; 'resources/node_resource'),
      'callback' =&gt; '_node_resource_create',
      'args' =&gt; array(
        array(
          'name' =&gt; 'node',
          'optional' =&gt; FALSE,
          'source' =&gt; 'data',
          'description' =&gt; 'The node data to create',
          'type' =&gt; 'array',
        ),
      ),
      'access callback' =&gt; '_node_resource_access',
      'access arguments' =&gt; array('create'),
      'access arguments append' =&gt; TRUE,
    ),
    'update' =&gt; array(
      'file' =&gt; array('type' =&gt; 'inc', 'module' =&gt; 'services', 'name' =&gt; 'resources/node_resource'),
      'callback' =&gt; '_node_resource_update',
      'args' =&gt; array(
        array(
          'name' =&gt; 'nid',
          'optional' =&gt; FALSE,
          'source' =&gt; array('path' =&gt; 0),
          'type' =&gt; 'int',
          'description' =&gt; 'The nid of the node to get',
        ),
        array(
          'name' =&gt; 'node',
          'optional' =&gt; FALSE,
          'source' =&gt; 'data',
          'description' =&gt; 'The node data to update',
          'type' =&gt; 'array',
        ),
      ),
      'access callback' =&gt; '_node_resource_access',
      'access arguments' =&gt; array('update'),
      'access arguments append' =&gt; TRUE,
    ),
    'delete' =&gt; array(
      'file' =&gt; array('type' =&gt; 'inc', 'module' =&gt; 'services', 'name' =&gt; 'resources/node_resource'),
      'callback' =&gt; '_node_resource_delete',
      'args' =&gt; array(
        array(
          'name' =&gt; 'nid',
          'optional' =&gt; FALSE,
          'source' =&gt; array('path' =&gt; 0),
          'type' =&gt; 'int',
        ),
      ),
      'access callback' =&gt; '_node_resource_access',
      'access arguments' =&gt; array('delete'),
      'access arguments append' =&gt; TRUE,
    ),
    'index' =&gt; array(
      'file' =&gt; array('type' =&gt; 'inc', 'module' =&gt; 'services', 'name' =&gt; 'resources/node_resource'),
      'callback' =&gt; '_node_resource_index',
      'args' =&gt; array(
        array(
          'name' =&gt; 'page',
          'optional' =&gt; TRUE,
          'type' =&gt; 'int',
          'description' =&gt; 'The zero-based index of the page to get, defaults to 0.',
          'default value' =&gt; 0,
          'source' =&gt; array('param' =&gt; 'page'),
        ),
        array(
          'name' =&gt; 'fields',
          'optional' =&gt; TRUE,
          'type' =&gt; 'string',
          'description' =&gt; 'The fields to get.',
          'default value' =&gt; '*',
          'source' =&gt; array('param' =&gt; 'fields'),
        ),
        array(
          'name' =&gt; 'parameters',
          'optional' =&gt; TRUE,
          'type' =&gt; 'array',
          'description' =&gt; 'Parameters array',
          'default value' =&gt; array(),
          'source' =&gt; array('param' =&gt; 'parameters'),
        ),
        array(
          'name' =&gt; 'pagesize',
          'optional' =&gt; TRUE,
          'type' =&gt; 'int',
          'description' =&gt; 'Number of records to get per page.',
          'default value' =&gt; variable_get('services_node_index_page_size', 20),
          'source' =&gt; array('param' =&gt; 'pagesize'),
        ),
      ),
      'access arguments' =&gt; array('access content'),
    ),
  ),
  'targeted_actions' =&gt; array(
    'attach_file' =&gt; array(
      'help' =&gt; 'Upload and attach file(s) to a node. POST multipart/form-data to node/123/attach_file',
      'file' =&gt; array('type' =&gt; 'inc', 'module' =&gt; 'services', 'name' =&gt; 'resources/node_resource'),
      'callback' =&gt; '_node_resource_attach_file',
      'access callback' =&gt; '_node_resource_access',
      'access arguments' =&gt; array('update'),
      'access arguments append' =&gt; TRUE,
      'args' =&gt; array(
        array(
          'name' =&gt; 'nid',
          'optional' =&gt; FALSE,
          'source' =&gt; array('path' =&gt; 0),
          'type' =&gt; 'int',
          'description' =&gt; 'The nid of the node to attach a file to',
        ),
        array(
          'name' =&gt; 'field_name',
          'optional' =&gt; FALSE,
          'source' =&gt; array('data' =&gt; 'field_name'),
          'description' =&gt; 'The file parameters',
          'type' =&gt; 'string',
        ),
        array(
          'name' =&gt; 'attach',
          'optional' =&gt; TRUE,
          'source' =&gt; array('data' =&gt; 'attach'),
          'description' =&gt; 'Attach the file(s) to the node. If FALSE, this clears ALL files attached, and attaches the files',
          'type' =&gt; 'int',
          'default value' =&gt; TRUE,
        ),
        array(
          'name' =&gt; 'field_values',
          'optional' =&gt; TRUE,
          'source' =&gt; array('data' =&gt; 'field_values'),
          'description' =&gt; 'The extra field values',
          'type' =&gt; 'array',
          'default value' =&gt; array(),
        ),
      ),
    ),
  ),
  'relationships' =&gt; array(
    'resources' =&gt; array(
      'file' =&gt; array('type' =&gt; 'inc', 'module' =&gt; 'services', 'name' =&gt; 'resources/node_resource'),
      'help'   =&gt; t('This method returns files associated with a node.'),
      'access callback' =&gt; '_node_resource_access',
      'access arguments' =&gt; array('view'),
      'access arguments append' =&gt; TRUE,
      'callback' =&gt; '_node_resource_load_node_files',
      'args'     =&gt; array(
        array(
          'name' =&gt; 'nid',
          'optional' =&gt; FALSE,
          'source' =&gt; array('path' =&gt; 0),
          'type' =&gt; 'int',
          'description' =&gt; 'The nid of the node whose files we are getting',
        ),
        array(
          'name' =&gt; 'file_contents',
          'type' =&gt; 'int',
          'description'  =&gt; t('To return file contents or not.'),
          'source' =&gt; array('path' =&gt; 2),
          'optional' =&gt; TRUE,
          'default value' =&gt; TRUE,
        ),
        array(
          'name'         =&gt; 'image_styles',
          'type'         =&gt; 'int',
          'description'  =&gt; t('To return image styles or not.'),
          'source'       =&gt; array('path' =&gt; 3),
          'optional'     =&gt; TRUE,
          'default value' =&gt; FALSE,
        ),
      ),
    ),
  ),