{"templateId":"openapi_docs","sharedDataIds":{"openAPIDocsStore":"oas-bundled.yaml","sidebar":"sidebar-sidebars.yaml"},"props":{"definitionId":"bundled.yaml","dynamicMarkdocComponents":[],"baseSlug":"/bundled","seo":{"title":"GetSales API","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"itemId":"","disableAutoScroll":true,"metadata":{"type":"openapi","title":"GetSales API","description":"The GetSales API lets you manage your CRM data, automations, messaging, AI agents, and integrations programmatically.\n\n## Authentication\n\nAll requests require the following header:\n\n| Header | Description |\n|--------|-------------|\n| `Authorization` | `Bearer {API_KEY}` — your API key from Workspace Settings → API Keys |\n\n## Rate Limits\n\n300 requests per minute per API key.\n\n## Pagination\n\nAll list endpoints support the following parameters:\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `limit` | integer | 20 | Items per page (max 100) |\n| `offset` | integer | 0 | Number of items to skip |\n| `order_field` | string | `created_at` | Field to sort by |\n| `order_type` | string | `desc` | Sort direction: `asc` or `desc` |\n\nList responses return:\n```json\n{\n  \"data\": [...],\n  \"limit\": 20,\n  \"offset\": 0,\n  \"total\": 150,\n  \"has_more\": true\n}\n```\n\n## LinkedIn Identifiers\n\nWhen creating or updating contacts, use the `linkedin_id` field — it is a universal parser that accepts **any** LinkedIn identifier in any format:\n\n| Input format | Example |\n|-------------|---------|\n| Profile URL | `https://www.linkedin.com/in/jane-smith-12345` |\n| Sales Navigator URL | `https://www.linkedin.com/sales/lead/ACoAABfFrqkBk9MxhGQ` |\n| `/people/` URL | `https://www.linkedin.com/people/ACoAABfFrqkBk9MxhGQ` |\n| Plain nickname | `jane-smith-12345` |\n| Raw `ln_id` | `ACoAADrsd-ABteDBfksYhLyCV5nv4ElCexywC6M` |\n| Raw `sn_id` | `ACwAADrsd-ABaJhvqbhrHnqI4oTkLX2GA9bidpo` |\n\nThe backend automatically detects the format, extracts the relevant ID, and stores it in the correct field (`linkedin`, `ln_id`, or `sn_id`). This means you don't need to normalize or parse LinkedIn URLs yourself — just pass whatever you have.\n\n> The `linkedin` field in responses always contains the normalized nickname only (e.g. `jane-smith-12345`), never a full URL.\n\n## Errors\n\nAll errors follow a consistent format:\n```json\n{\n  \"error\": {\n    \"reason\": \"validation_error\",\n    \"message\": \"The name field is required.\",\n    \"data\": {}\n  },\n  \"message\": \"Validation failed\",\n  \"code\": 422\n}\n```\n\n| Code | Reason | Description |\n|------|--------|-------------|\n| 400 | `bad_request` | Missing required headers or malformed request |\n| 401 | `auth_exception` | Invalid or expired API key |\n| 402 | `payment_required` | Insufficient credits |\n| 403 | `access_denied` | No access to this resource |\n| 422 | `validation_error` | Request body validation failed |\n"},"compilationErrors":[],"markdown":{"partials":{},"variables":{"rbac":{"teams":["anonymous"]},"user":{},"remoteAddr":{"hostname":"api.getsales.io","port":4000,"ipAddress":"216.73.217.109"},"lang":"default_locale","env":{"PUBLIC_REDOCLY_BRANCH_NAME":"main"}}},"pagePropGetterError":{"message":"","name":""}},"slug":"/bundled","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}