<!-- AUTO-GENERATED from the capability registry — regenerate: npm run generate:registry -->

# `ocean_people` — Orange Slice capability

> Outcome-priced capability. One price for the answer, whichever providers it took.
> Everything we expose, with prices: https://orangeslice.ai/llms.txt

Find people by seniority, department and job title at companies matched by lookalike domains or firmographics. Billed 15 credits per person returned.

## Price

**$0.03 per result, up to $3.00 per call**

Billed per row returned, within the floor and ceiling above.

The price is a property of the outcome, not of the work behind it. Whichever
vendor serves this call, and whatever it costs us, the number above is the number
quoted before the run and charged after it.


## Call it

**CLI**

```bash
orangeslice search ocean_people --lookalike-domain stripe.com --seniority VP --department Engineering --size 25
```

**HTTP**

```bash
curl -X POST 'https://orangeslice.ai/api/v1/run' \
  -H 'Authorization: Bearer $ORANGESLICE_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"capability":"ocean_people","input":{"companyCountry":"<string[]>","companySize":"<string[]>","department":"<string[]>"}}'
```

**SDK**

```ts
await services.ocean.search.people({ companyCountry: "…", companySize: "…", department: "…" });
```

## Inputs

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `companyCountry` | string[] | No |  |
| `companySize` | string[] | No |  |
| `department` | string[] | No | e.g. Sales, Marketing, Engineering. Case does not matter |
| `industry` | string[] | No |  |
| `jobTitleKeyword` | string[] | No | Words that must appear in the job title |
| `lookalikeDomain` | string[] | No | Restrict to people at companies similar to these domains |
| `personCountry` | string[] | No | Countries the person is in |
| `searchAfter` | string | No | Cursor from a previous page's `searchAfter` |
| `seniority` | string[] | No | One of: Owner, Founder, Board Member, C-Level, Partner, VP, Head, Director, Manager, Senior, Professional, Entry, Intern. Case does not matter |
| `size` | number | No | People to return, 1-100. 15 credits each |
| `withEmail` | boolean | No | Ask Ocean to look up email too. Off by default — see `enrich work_email` |
| `withPhone` | boolean | No | Ask Ocean to look up phone too. Off by default |

Inputs may also be piped as NDJSON, one JSON object per line.

## Output

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "people": {
      "default": [],
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "firstName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "lastName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "fullName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "jobTitle": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "seniority": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "department": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "domain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "companyName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "linkedinUrl": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "country": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "location": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "oceanPersonId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "firstName",
          "lastName",
          "fullName",
          "jobTitle",
          "seniority",
          "department",
          "domain",
          "companyName",
          "linkedinUrl",
          "country",
          "location",
          "oceanPersonId"
        ],
        "additionalProperties": false
      }
    },
    "total": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "searchAfter": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "people",
    "total",
    "searchAfter"
  ],
  "additionalProperties": false
}
```

The field that carries the answer is `people`. It is
`null` — or empty — when nothing was found, which is how a miss is told from a
hit without knowing anything else about this entry.

## Before you run

- **Price it first.** `orangeslice search ocean_people --dry-run` returns the
  exact dollar cost and spends nothing.
- **Large runs need approval.** Above the spend-gate threshold a run exits **7**
  until it carries a plan token, and only a dry run mints one.
- **Scopes:** enrich
- **Permitted uses:** research, outreach, export

## Exit codes

`0` ok · `2` bad input · `3` auth · `4` not found · `5` provider ·
`6` rate limited · `7` spend gate, nothing billed · `8` timeout ·
`9` a third-party account needs connecting
