> ## Documentation Index
> Fetch the complete documentation index at: https://docs.signalhire.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Profiles Without Contacts

> Retrieve public profile data without contact details using a separate credit type.

## Overview

By adding `withoutContacts: true` to a Person API request, a profile's public data can be retrieved —
name, location, work experience, education, skills — **without consuming standard contact credits**.
The LinkedIn profile link is still included in the response.

This is useful when only profile metadata is needed without contact information.

<Note>
  This mode uses a **separate credit type**. Contact [support@signalhire.com](mailto:support@signalhire.com) to purchase these credits.
</Note>

## Request Parameters

Uses the same endpoint and parameters as [Retrieve Person Data](/person-api/retrieve-person#request-parameters), with `withoutContacts` set to `true`. All other parameters, response codes, and rate limits apply identically.

`withoutContacts` can also be combined with `withoutWaterfall: true` for a fully synchronous flow — profile metadata returned immediately without contacts and without needing a callback server. In this case `callbackUrl` must not be included.

## Request Example (Async with Callback)

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://www.signalhire.com/api/v1/candidate/search \
  -H 'apikey: your_secret_api_key' \
  --data '{
  "items": ["https://www.linkedin.com/in/profile1"],
  "withoutContacts": true,
  "callbackUrl": "https://www.yourdomain.com/yourCallbackUrl"
  }'
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
  "https://www.signalhire.com/api/v1/candidate/search",
  headers={"apikey": "your_secret_api_key"},
  json={
  "items": ["https://www.linkedin.com/in/profile1"],
  "withoutContacts": True,
  "callbackUrl": "https://www.yourdomain.com/yourCallbackUrl"
  }
  )
  ```

  ```javascript Node.js theme={null}
  const axios = require('axios');

  const response = await axios.post(
  'https://www.signalhire.com/api/v1/candidate/search',
  {
      items: ['https://www.linkedin.com/in/profile1'],
      withoutContacts: true,
      callbackUrl: 'https://www.yourdomain.com/yourCallbackUrl'
  },
  {
      headers: { apikey: 'your_secret_api_key' }
  }
  );
  ```

  ```java Java theme={null}
  import java.net.http.*;
  import java.net.URI;

  HttpClient client = HttpClient.newHttpClient();

  String body = """
  {
      "items": ["https://www.linkedin.com/in/profile1"],
      "withoutContacts": true,
      "callbackUrl": "https://www.yourdomain.com/yourCallbackUrl"
  }
  """;

  HttpRequest request = HttpRequest.newBuilder()
  .uri(URI.create("https://www.signalhire.com/api/v1/candidate/search"))
  .header("apikey", "your_secret_api_key")
  .header("Content-Type", "application/json")
  .POST(HttpRequest.BodyPublishers.ofString(body))
  .build();

  HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
  ```

  ```ruby Ruby theme={null}
  require 'net/http'
  require 'json'

  uri = URI('https://www.signalhire.com/api/v1/candidate/search')
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  request = Net::HTTP::Post.new(uri)
  request['apikey'] = 'your_secret_api_key'
  request['Content-Type'] = 'application/json'
  request.body = {
      items: ['https://www.linkedin.com/in/profile1'],
      withoutContacts: true,
      callbackUrl: 'https://www.yourdomain.com/yourCallbackUrl'
  }.to_json

  response = http.request(request)
  ```
</CodeGroup>

## Request Example (Sync without Callback)

To retrieve profile metadata synchronously without contacts and without a callback server, combine `withoutContacts: true` with `withoutWaterfall: true`:

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://www.signalhire.com/api/v1/candidate/search \
  -H 'apikey: your_secret_api_key' \
  --data '{
  "items": ["https://www.linkedin.com/in/profile1"],
  "withoutContacts": true,
  "withoutWaterfall": true
  }'
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
  "https://www.signalhire.com/api/v1/candidate/search",
  headers={"apikey": "your_secret_api_key"},
  json={
  "items": ["https://www.linkedin.com/in/profile1"],
  "withoutContacts": True,
  "withoutWaterfall": True
  }
  )
  ```

  ```javascript Node.js theme={null}
  const axios = require('axios');

  const response = await axios.post(
  'https://www.signalhire.com/api/v1/candidate/search',
  {
      items: ['https://www.linkedin.com/in/profile1'],
      withoutContacts: true,
      withoutWaterfall: true
  },
  { headers: { apikey: 'your_secret_api_key' } }
  );
  ```

  ```java Java theme={null}
  import java.net.http.*;
  import java.net.URI;

  HttpClient client = HttpClient.newHttpClient();

  String body = """
  {
      "items": ["https://www.linkedin.com/in/profile1"],
      "withoutContacts": true,
      "withoutWaterfall": true
  }
  """;

  HttpRequest request = HttpRequest.newBuilder()
  .uri(URI.create("https://www.signalhire.com/api/v1/candidate/search"))
  .header("apikey", "your_secret_api_key")
  .header("Content-Type", "application/json")
  .POST(HttpRequest.BodyPublishers.ofString(body))
  .build();

  HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
  ```

  ```ruby Ruby theme={null}
  require 'net/http'
  require 'json'

  uri = URI('https://www.signalhire.com/api/v1/candidate/search')
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  request = Net::HTTP::Post.new(uri)
  request['apikey'] = 'your_secret_api_key'
  request['Content-Type'] = 'application/json'
  request.body = {
      items: ['https://www.linkedin.com/in/profile1'],
      withoutContacts: true,
      withoutWaterfall: true
  }.to_json

  response = http.request(request)
  ```
</CodeGroup>

## Response

The callback format is identical to the standard [Retrieve Person Data](/person-api/retrieve-person#callback-format) response, but contact fields (phone numbers, email addresses) will be absent from the `candidate` object.
The LinkedIn profile link remains available in the `social` array. See [Candidate Object](/person-api/candidate-object) for the full field reference.

When using sync mode (`withoutWaterfall: true`), results are returned directly in the response body in the same format — no callback is sent.

## Callback Delivery

Callback delivery rules are identical to the standard mode — see [Callback Delivery](/person-api/retrieve-person#callback-delivery) for details on timeouts, retries, and failed delivery notifications.

This section applies only to async mode. When using `withoutWaterfall: true`, there is no callback.

## Checking Credits

This mode uses a separate credit type, independent of standard contact credits. To check the remaining without-contacts balance, use the `withoutContacts=true` parameter with the [Get Remaining Credits](/person-api/credits) endpoint.

The `X-Credits-Left` header is included in every response and automatically reflects the credit type matching the request — without-contacts credits when `withoutContacts: true` is set, standard credits otherwise.
