{"id":"d8664bf7-5664-4350-bcec-28003f1a94b5","entityType":"agent","slug":"clawhub-sheksushant-cold-email-salesblink","name":"Cold Email Campaigns with SalesBlink","canonicalUrl":"https://www.xpersona.co/agent/clawhub-sheksushant-cold-email-salesblink","canonicalPath":"/agent/clawhub-sheksushant-cold-email-salesblink","generatedAt":"2026-10-11T07:42:50.422Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T04:12:19.559Z","emptyReason":null},"description":"Run cold email sequences on autopilot and manage full sales outreach campaigns via the SalesBlink API. Use this skill to build automated multi-step email cam...","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17adpah8ftb77dvdzgdjdm31n84scpv:cold-email-salesblink","sourceUrl":"https://clawhub.ai/sheksushant/cold-email-salesblink","homepage":"https://clawhub.ai/sheksushant/skills/cold-email-salesblink","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/sheksushant/cold-email-salesblink","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/sheksushant/skills/cold-email-salesblink","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Cold Email Campaigns with SalesBlink technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T04:12:19.559Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T04:12:19.559Z","emptyReason":null},"stars":null,"forks":null,"downloads":1164,"packageName":null,"latestVersion":"1.0.9","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T04:12:19.485Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T04:12:19.559Z","lastCrawledAt":"2026-10-11T04:12:19.485Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T04:12:19.485Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.9","createdAt":"2026-05-13T16:44:06.712Z","changelog":"Version 1.0.9 - Added detailed safety and compliance guardrails for campaign launches, billing, API/key management, sender credentials, lead privacy, and persistent campaigns. - Updated documentation to require explicit user confirmation for sensitive actions (e.g., launching sequences, billing, connecting senders). - No code changes detected; changes are documentation-only. - Version number in SKILL.md corrected to 1.0.0.","fileCount":19,"zipByteSize":27836},{"version":"1.0.8","createdAt":"2026-05-13T16:30:37.843Z","changelog":"- Added references for API keys, billing, and done-for-you (DFY) service documentation. - Updated description to mention support for workspace/team management and generic HTTP requests. - Expanded endpoint categories to include additional management and warmup features. - Documented the new public signup endpoint for creating a SalesBlink account without an API key. - Clarified compatibility and authentication details.","fileCount":18,"zipByteSize":24186},{"version":"1.0.7","createdAt":"2026-05-07T06:52:40.495Z","changelog":"- Added strict user confirmation guardrails before performing any mutating actions (create, update, delete, launch, reply, etc). - Updated documentation to clarify that all new campaigns/sequences should default to paused until explicitly confirmed by the user. - Added guidance to prefer OAuth when connecting sending accounts and to avoid collecting mailbox credentials. - Reduced and focused listed capabilities, removing workspace/team management and generic HTTP request instructions. - Added a homepage link in metadata for easier reference to documentation.","fileCount":15,"zipByteSize":20613},{"version":"1.0.6","createdAt":"2026-05-04T17:09:51.239Z","changelog":"No user-facing changes in this release; no file changes detected in version 1.0.6.","fileCount":15,"zipByteSize":19179},{"version":"1.0.5","createdAt":"2026-05-04T16:53:00.428Z","changelog":"Version 1.0.5 of cold-email-salesblink - No file changes detected in this release. - Functionality, API usage, instructions, and documentation remain unchanged. - No new features, fixes, or updates introduced in this version.","fileCount":15,"zipByteSize":19179},{"version":"1.0.4","createdAt":"2026-04-29T05:47:57.754Z","changelog":"No changes detected in this release. - Version incremented to 1.0.4 with no file modifications. - Functionality, endpoints, and documentation remain unchanged.","fileCount":15,"zipByteSize":19179},{"version":"1.0.3","createdAt":"2026-04-28T17:30:16.459Z","changelog":"- Updated API authentication instructions: Authorization header example now uses \"key-****\" instead of the full API key. - No other functional or behavioral changes in this release.","fileCount":15,"zipByteSize":19178},{"version":"1.0.2","createdAt":"2026-04-28T17:27:48.186Z","changelog":"- Removed requirement for SMTP_PASSWORD and IMAP_PASSWORD environment variables—now only SALESBLINK_API_KEY is needed. - No changes to API usage, features, or skill behavior.","fileCount":15,"zipByteSize":19175}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17adpah8ftb77dvdzgdjdm31n84scpv:cold-email-salesblink","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17adpah8ftb77dvdzgdjdm31n84scpv:cold-email-salesblink` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/sheksushant/cold-email-salesblink before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sheksushant-cold-email-salesblink/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sheksushant-cold-email-salesblink/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sheksushant-cold-email-salesblink/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sheksushant-cold-email-salesblink/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sheksushant-cold-email-salesblink/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sheksushant-cold-email-salesblink/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T07:42:50.418Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sheksushant-cold-email-salesblink/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sheksushant-cold-email-salesblink/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sheksushant-cold-email-salesblink/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sheksushant-cold-email-salesblink/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T04:12:19.559Z","emptyReason":null},"readme":"Skill: Cold Email Campaigns with SalesBlink\n\nOwner: sheksushant\n\nSummary: Run cold email sequences on autopilot and manage full sales outreach campaigns via the SalesBlink API. Use this skill to build automated multi-step email cam...\n\nTags: latest:1.0.9\n\nVersion history:\n\nv1.0.9 | 2026-05-13T16:44:06.712Z | user\n\nVersion 1.0.9\n\n- Added detailed safety and compliance guardrails for campaign launches, billing, API/key management, sender credentials, lead privacy, and persistent campaigns.\n- Updated documentation to require explicit user confirmation for sensitive actions (e.g., launching sequences, billing, connecting senders).\n- No code changes detected; changes are documentation-only.\n- Version number in SKILL.md corrected to 1.0.0.\n\nv1.0.8 | 2026-05-13T16:30:37.843Z | user\n\n- Added references for API keys, billing, and done-for-you (DFY) service documentation.\n- Updated description to mention support for workspace/team management and generic HTTP requests.\n- Expanded endpoint categories to include additional management and warmup features.\n- Documented the new public signup endpoint for creating a SalesBlink account without an API key.\n- Clarified compatibility and authentication details.\n\nv1.0.7 | 2026-05-07T06:52:40.495Z | user\n\n- Added strict user confirmation guardrails before performing any mutating actions (create, update, delete, launch, reply, etc).\n- Updated documentation to clarify that all new campaigns/sequences should default to paused until explicitly confirmed by the user.\n- Added guidance to prefer OAuth when connecting sending accounts and to avoid collecting mailbox credentials.\n- Reduced and focused listed capabilities, removing workspace/team management and generic HTTP request instructions.\n- Added a homepage link in metadata for easier reference to documentation.\n\nv1.0.6 | 2026-05-04T17:09:51.239Z | user\n\nNo user-facing changes in this release; no file changes detected in version 1.0.6.\n\nv1.0.5 | 2026-05-04T16:53:00.428Z | user\n\nVersion 1.0.5 of cold-email-salesblink\n\n- No file changes detected in this release.\n- Functionality, API usage, instructions, and documentation remain unchanged.\n- No new features, fixes, or updates introduced in this version.\n\nv1.0.4 | 2026-04-29T05:47:57.754Z | user\n\nNo changes detected in this release.\n\n- Version incremented to 1.0.4 with no file modifications.\n- Functionality, endpoints, and documentation remain unchanged.\n\nv1.0.3 | 2026-04-28T17:30:16.459Z | user\n\n- Updated API authentication instructions: Authorization header example now uses \"key-****\" instead of the full API key.\n- No other functional or behavioral changes in this release.\n\nv1.0.2 | 2026-04-28T17:27:48.186Z | user\n\n- Removed requirement for SMTP_PASSWORD and IMAP_PASSWORD environment variables—now only SALESBLINK_API_KEY is needed.\n- No changes to API usage, features, or skill behavior.\n\nv1.0.1 | 2026-04-28T17:21:35.727Z | auto\n\n- Improved and clarified skill description for broader, easier-to-understand coverage of cold email and sales outreach via SalesBlink.\n- Added explicit notes on spintax support for templates and guidance for users without prior SalesBlink knowledge.\n- Enhanced compatibility section with new required environment variables (SALESBLINK_API_KEY, SMTP_PASSWORD, IMAP_PASSWORD) and clarified authentication instructions.\n- Updated documentation and metadata for improved onboarding and skill integration.\n- No API or endpoint changes; documentation and integration-focused improvements only.\n\nv1.0.0 | 2026-04-27T13:19:32.215Z | user\n\nSalesBlink cold-email-salesblink v1.0.0 – initial release\n\n- Enables interaction with SalesBlink’s REST API for cold email outreach and sales automation.\n- Supports creating/managing email lists, sequences, templates, senders, and contacts.\n- Provides access to analytics, inbox replies, deliverability testing, and workspace management.\n- Requires user API key; works with any HTTP client.\n- Includes detailed guidance on endpoint usage, authentication, rate limits, and error handling.\n\nArchive index:\n\nArchive v1.0.9: 19 files, 27836 bytes\n\nFiles: references/account-config.md (419b), references/activity.md (1350b), references/api-keys.md (1610b), references/billing.md (1298b), references/contacts.md (3867b), references/dfy.md (8870b), references/folders.md (910b), references/inbox-placement.md (4673b), references/inbox.md (4245b), references/lists.md (2623b), references/organization.md (2191b), references/reports.md (780b), references/senders.md (6347b), references/sequences.md (6628b), references/templates.md (2615b), references/workflows.md (4018b), skill-card.md (3780b), SKILL.md (13395b), _meta.json (140b)\n\nFile v1.0.9:SKILL.md\n\n---\nname: cold-email-salesblink\ndescription: >\n  Run cold email sequences on autopilot and manage full sales outreach campaigns via the SalesBlink API.\n  Use this skill to build automated multi-step email campaigns (sequences), manage leads and email lists,\n  create reusable templates with merge variables and spintax, connect sending accounts (Gmail, Outlook, SMTP),\n  handle inbox replies, and track campaign analytics (opens, clicks, replies, sent).\n  Also supports bulk contact imports, email deliverability testing (inbox placement / spam checks),\n  sender warmup links, workspace/team management, and any HTTP request to the SalesBlink platform.\nversion: 1.0.0\ncompatibility: >\n  Requires network access to run.salesblink.io and a SALESBLINK_API_KEY.\n  Supports any HTTP client (curl, Node.js fetch, Python requests, PowerShell, etc.).\n  No prior knowledge of SalesBlink is needed: the skill guides you through connecting email accounts,\n  importing leads, writing templates, building sequences, launching campaigns, and monitoring deliverability.\nmetadata:\n  openclaw:\n    requires:\n      env:\n        - SALESBLINK_API_KEY\n    primaryEnv: SALESBLINK_API_KEY\n---\n\n# SalesBlink Public REST API v1.0.0\n\n## When to use this skill\n\nUse this skill when the user wants to:\n\n- Create, update, or manage email lists, sequences, templates, or senders\n- Add, update, move, or remove contacts/leads\n- Send or reply to emails via the inbox\n- Check campaign analytics (opens, clicks, replies, sent)\n- Set up outreach campaigns end-to-end\n- Manage workspaces, users, folders, or deliverability tests\n- Make any HTTP request to `run.salesblink.io/api/public/v1.0.0`\n\n## Safety & Compliance Guardrails\n\nBefore performing any high-risk action, pause and obtain explicit user confirmation. Document the confirmation in your reasoning.\n\n### Sequence launches (ASI02)\n- **Always create sequences with `paused: true` first.**\n- Before launching (setting `paused: false` or `launchTimingMode: \"now\"`), show the user:\n  - Final recipient list(s) and estimated lead count\n  - Sender account(s) that will send the emails\n  - Template subject lines and content for every step\n  - Schedule / timezone / sending hours\n  - Pause state and stop conditions (e.g., `stopWhenReplyRecieved`)\n- Only launch after the user explicitly confirms. Do not auto-launch.\n- Prefer `paused: true` and let the user resume manually when ready.\n\n### DFY orders and billing (ASI02)\n- Treat all DFY domain/mailbox orders and billing actions as **payment-sensitive**.\n- Before placing any order, confirm with the user:\n  - Exact domain name(s) to purchase or connect\n  - Mailbox count, provider (Google / Outlook / Azure), and price\n  - Cancellation limits and recurring cost implications\n- Do not place DFY orders or manage payment methods unless explicitly requested.\n\n### API key management (ASI03)\n- Only use `/keys` endpoints for **explicit credential-administration requests**.\n- Before refreshing or deleting a key, confirm:\n  - The exact key name / ID\n  - Impact on existing integrations\n  - That the user has updated any dependent systems if rotating\n\n### Sender credentials (ASI03)\n- Use **dedicated outreach mailboxes** wherever possible. Avoid connecting primary personal or company mailboxes.\n- Never store or log SMTP/IMAP passwords in chat history.\n- Remind the user to review OAuth/provider permissions before authorizing Gmail or Outlook connections.\n\n### Lead data privacy (ASI07)\n- Upload **only** leads and files the user has explicitly approved for SalesBlink.\n- Do not include unrelated private data in CSVs, templates, or attachments.\n- Review CSV contents before bulk import to ensure no sensitive PII is unintentionally included.\n\n### Persistent campaigns (ASI10)\n- Document the stop condition for every active or evergreen sequence.\n- Periodically remind the user to audit active, evergreen, and recurring items in their SalesBlink account.\n- When creating sequences, default to non-evergreen (`evergreen: false`) unless the user explicitly requests continuous running.\n\n## Gotchas\n\n- **ID types matter**: Templates and contact archive use MongoDB ObjectId (24-char hex). All other entities use UUID v4.\n- **messageId** is the RFC822 Message-ID (e.g. `<id@domain.com>`) or Microsoft Graph ID. **Crucial:** Always URL-encode this ID when using it as a path parameter (e.g. in `/inbox/:messageId/thread`). This is distinct from the internal UUID `id`.\n- **`senders` is a comma-separated string**, not an array. It can mix sender IDs and folder IDs — the server auto-detects each.\n- **Sequence `steps` fully replace on PATCH**. Send the complete desired array.\n- **Verification flags are IRREVERSIBLE**: `verification`, `archive_invalid`, `archive_risky` on lists can only be turned ON, never OFF.\n- **Sequences default to paused**: If `paused` is omitted on create, it defaults to `true`.\n- **`launchTimingMode: \"now\"` starts in 5 minutes**, not instantly.\n- **Template attachments use FormData field `attachment`** (not `attachments`). Max 3 per template.\n- **Remove template attachments via `remove_attachments`** array of file **names**.\n- **Adding SMTP sender requires `from_email`**, not `email`.\n- **If an endpoint for a specific task is not mentioned then tell the user that the endpoint is not available**\n- **If user does not have a list, ask them for a CSV file, or list of lead emails with data.**\n- **If email sender is not connected, help them connect one using APIs.**\n- **When asked to create a sequence or campaign for cold email outreach, first ask them about their ICP, Offer, and other details.**\n\n## Base URL\n\n`https://run.salesblink.io/api/public/v1.0.0`\n\n## Authentication\n\nAsk the user for their SALESBLINK_API_KEY: `https://run.salesblink.io/account/integration/api`\n\nPass it in every request as the `Authorization` header (no \"Bearer\" prefix):\n\n**Header:** `Authorization: key-****`\n\n## Rate Limits\n\n| Method        | Limit | Window     |\n| ------------- | ----- | ---------- |\n| GET           | 30    | per minute |\n| POST / PATCH  | 15    | per minute |\n| PUT (archive) | 10    | per minute |\n\nOn `429 Too Many Requests`: wait at least 60 seconds before retrying. For batch operations, insert a 4-second delay between requests.\n\n## Public Signup\n\n**POST** `/signup`\n\nCreate a new SalesBlink account. This is a public endpoint and does not require an API key. **Successful signup returns an API key**, allowing you to proceed with authenticated requests immediately.\n\n**Request Body:**\n```json\n{\n  \"email\": \"user@example.com\",\n  \"password\": \"SecurePassword123\",\n  \"name\": \"John Doe\"\n}\n```\n\n**Response Body:**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"account_id\": \"...\",\n    \"user_id\": \"...\",\n    \"api_key\": \"key-...\"\n  }\n}\n```\n\n**Constraints:**\n- `password`: Min 8 characters, max 48 characters, at least one uppercase and one lowercase letter.\n- **Rate Limit**: 2 signups per day.\n\n## Pagination\n\nMost list endpoints use `limit` (max 100) and `skip`. Activity endpoints (`/sent`, `/opens`, `/clicks`, `/replies`) use `per_page` (max 100) and `page` (1-indexed).\n\nAlways paginate. Never assume a single request returns all data.\n\n## Endpoint Categories\n\nRead the relevant reference file before performing operations in that domain:\n\n- **Lists & contacts/leads** → [references/lists.md](references/lists.md) and [references/contacts.md](references/contacts.md)\n  - Use these endpoints when the user wants to fetch or manage lists that contain leads/contacts. A list is a container for contacts/leads. Each contact/lead contains fields like Email, First_Name, Last_Name, Phone, Company, Title, and custom fields. Contacts are added to lists in batches (up to 500 per request), can be moved between lists, updated, or removed.\n\n- **Email templates** → [references/templates.md](references/templates.md)\n  - Use these endpoints when the user wants to create or manage reusable email templates. A template has a name, subject_line, and HTML content that supports merge variables like {{first_name}} and {{company}}. Templates can have up to 3 attachments and are referenced by sequences when building outreach steps.\n\n- **Sequences & email campaigns** → [references/sequences.md](references/sequences.md)\n  - Use these endpoints when the user wants to create or manage automated email campaigns (sequences). A sequence connects lists (who to email), senders (which accounts send), and templates (what to send) into a timed step-by-step workflow. Steps alternate between email sends and delay periods. Sequences can be launched, paused, resumed, cloned, or archived.\n\n- **Senders, OAuth & warmup links** → [references/senders.md](references/senders.md)\n  - Use these endpoints when the user wants to connect or manage email sending accounts. A sender is an email account (SMTP/IMAP or OAuth-connected Gmail/Outlook) that sends emails on behalf of sequences. Multiple senders can be assigned to a sequence. Senders can also be organized into folders. Warmup links are used in email warmup processes to improve deliverability.\n\n- **Inbox & replies** → [references/inbox.md](references/inbox.md)\n  - Use these endpoints when the user wants to view or interact with email conversations. The inbox contains reply threads, sent emails, scheduled emails, and drafts. Each thread has a messageId. The user can reply to a lead's email, mark messages as read/unread, or classify outcomes.\n\n- **Activity tracking** → [references/activity.md](references/activity.md)\n  - Use these endpoints when the user wants to query engagement events. The system tracks four event types: sent (emails sent), opens (emails opened), clicks (links clicked), and replies (responses received). Events can be filtered by sequence, recipient email, and date range.\n\n- **Users & workspaces** → [references/organization.md](references/organization.md)\n  - Use these endpoints when the user wants to manage team membership or workspaces. A workspace is an account boundary. Users have roles (client, user, admin, developer). Only owners and admins can invite users or create workspaces.\n\n- **Folders** → [references/folders.md](references/folders.md)\n  - Use these endpoints when the user wants to organize resources into folders. Folders have a type (list, template, sequence, or email-sender) and group related resources together for easier management.\n\n- **Domains & signatures** → [references/account-config.md](references/account-config.md)\n  - Use these endpoints when the user wants to view account-level configuration. Custom tracking domains are used for click tracking in emails. Signatures are appended to outgoing emails.\n\n- **DFY domains & mailboxes** → [references/dfy.md](references/dfy.md)\n  - Use these endpoints when the user wants to purchase domains and provision mailboxes through the Done-For-You service. Start with `/domains/search` to find available domains, then place an order with Google Workspace, Outlook, or Azure mailboxes. Supports buying new domains or connecting existing ones.\n\n- **Billing & payment methods** → [references/billing.md](references/billing.md)\n  - Use these endpoints when the user wants to add or remove a saved payment card. Returns magic login links to the billing page.\n\n- **API Key Management** → [references/api-keys.md](references/api-keys.md)\n  - Use these endpoints when the user wants to manage API keys. Users can list all keys, create new keys, refresh an existing key (which generates a new one and revokes the old one), or delete a key.\n\n- **Reports** → [references/reports.md](references/reports.md)\n  - Use these endpoints when the user wants to fetch aggregated activity reports over a date range. Reports combine data across campaigns into summary views.\n\n- **Inbox placement tests** → [references/inbox-placement.md](references/inbox-placement.md)\n  - Use these endpoints when the user wants to test email deliverability. An inbox placement test sends a test email to seed email addresses across providers (Gmail, Outlook, etc.) and reports whether the email landed in inbox, spam, promotions, or other tabs. Tests can be one-time or recurring.\n\n- **End-to-end workflow examples** → [references/workflows.md](references/workflows.md)\n  - Use this reference when the user wants to set up a complete outreach campaign from scratch. It shows the full chain: create list → add contacts → create templates → fetch senders → create sequence → launch.\n\n## Error Handling\n\nAlways check the `success` boolean in the response body. A `200` status can still return `{ success: false, message: \"...\" }`.\n\n| Status | Meaning      | Action                                                |\n| ------ | ------------ | ----------------------------------------------------- |\n| 200    | Success      | Check `success` field                                 |\n| 400    | Bad request  | Re-check payload structure against the reference file |\n| 401    | Unauthorized | Verify API key                                        |\n| 403    | Forbidden    | Insufficient permissions (role too low)               |\n| 404    | Not found    | Verify the ID / endpoint                              |\n| 409    | Conflict     | Resource already exists or connection failed          |\n| 429    | Rate limited | Wait 60s, then retry                                  |\n| 500    | Server error | Retry once after 10s                                  |\n\nFile v1.0.9:_meta.json\n\n{\n  \"ownerId\": \"kn7fnmjb3nqezc1gc8b74fmgrh84rx5t\",\n  \"slug\": \"cold-email-salesblink\",\n  \"version\": \"1.0.9\",\n  \"publishedAt\": 1778690646712\n}\n\nFile v1.0.9:references/account-config.md\n\n# Account Config — Domains & Signatures\n\n## Domains\n\n**GET** `/domains`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList custom tracking domains for the account.\n\n## Signatures\n\n**GET** `/signatures`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList email signatures.\n\n> Signature IDs can be referenced when adding senders via the `signature_id` field. You can pass either the signature ID or its name.\n\nFile v1.0.9:references/activity.md\n\n# Activity Tracking\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/sent` | GET | Log of all sent emails |\n| `/opens` | GET | Email open events |\n| `/clicks` | GET | Link click events |\n| `/replies` | GET | Reply events |\n\n## Query Parameters\n\nAll activity endpoints support:\n\n| Param | Type | Description |\n|-------|------|-------------|\n| `per_page` | integer | Max 100 |\n| `page` | integer | 1-indexed |\n| `sequence_id` | string | Filter by sequence UUID |\n| `recipient_email_address` | string | Filter by email address |\n| `since` | integer | Filter events after this timestamp (ms) |\n| `from` | integer | Start of date range (timestamp, ms) |\n| `to` | integer | End of date range (timestamp, ms) |\n\n> Use `per_page` and `page` for activity endpoints — not `limit`/`skip`.\n\n## Response Format\n\nEach event includes:\n```json\n{\n  \"id\": \"...\",\n  \"time\": 1715000000000,\n  \"message\": \"Sent\",\n  \"type\": \"outreach\",\n  \"sequence\": \"sequence-uuid\",\n  \"email\": \"lead@example.com\",\n  \"sequence_name\": \"Campaign Name\"\n}\n```\n\nFor clicks and replies, `template_name` is also included.\n\n## Examples\n\n**GET** `/opens?sequence_id=SEQ_ID&per_page=100&page=1`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\n**GET** `/replies?since=TIMESTAMP_30_DAYS_AGO&per_page=100`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nFile v1.0.9:references/api-keys.md\n\n# API Key Management\n\n> **Restricted**: Only use these endpoints for explicit credential-administration requests. Confirm the exact key and impact before refreshing or deleting anything.\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/keys` | GET | List all API keys for the account |\n| `/keys` | POST | Create a new API key |\n| `/keys/:id/refresh` | POST | Refresh an existing API key (deletes old, creates new) |\n| `/keys/:id` | DELETE | Delete an API key |\n\n## Get API Keys\n\n**GET** `/keys`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nReturns a list of all API keys associated with the account.\n\n## Create API Key\n\n**POST** `/keys`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"name\": \"Zapier Integration\" }\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | A descriptive name for the API key |\n\n## Refresh API Key\n\n**POST** `/keys/:id/refresh`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nThis endpoint generates a new API key and deletes the old one identified by `:id`. \n\n> [!WARNING]\n> If you refresh the key you are currently using, you must update your integration immediately as the old key will be revoked.\n\n## Delete API Key\n\n**DELETE** `/keys/:id`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nDeletes the specified API key.\n\n> [!IMPORTANT]\n> - You cannot delete the API key you are currently using.\n> - At least one API key is required per account. If you want to replace your only key, use the Refresh endpoint instead.\n\nFile v1.0.9:references/billing.md\n\n# Billing & Payment Methods\n\n> **Payment Safety**: These endpoints generate magic login links to manage saved payment methods. Do not request these links unless the user explicitly asks to add or remove a payment card.\n\n## Add Card Login Link\n\n**POST** `/billing/add-card`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nGenerates a time-limited magic login link that redirects the user to the billing page where they can add a payment card.\n\nResponse:\n```json\n{\n  \"success\": true,\n  \"message\": \"Add card login link generated successfully\",\n  \"data\": {\n    \"login_link\": \"https://run.salesblink.io/magic?token=...&redirect=%2Faccount%2Fbilling%3Ftab%3Dcard\",\n    \"destination\": \"/account/billing?tab=card\",\n    \"purpose\": \"add_card\"\n  }\n}\n```\n\n## Remove Card Login Link\n\n**POST** `/billing/remove-card`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nGenerates a time-limited magic login link that redirects the user to the billing page where they can remove their saved payment card.\n\nResponse:\n```json\n{\n  \"success\": true,\n  \"message\": \"Remove card login link generated successfully\",\n  \"data\": {\n    \"login_link\": \"https://run.salesblink.io/magic?token=...&redirect=%2Faccount%2Fbilling%3Ftab%3Dcard\",\n    \"destination\": \"/account/billing?tab=card\",\n    \"purpose\": \"remove_card\"\n  }\n}\n```\n\nFile v1.0.9:references/contacts.md\n\n# Contacts & Leads\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/lists/:id/leads` | GET | Get leads in a list (paginated) |\n| `/contacts` | POST | Add up to 500 leads to a list |\n| `/contacts/remove` | POST | Remove a single lead by email from a list |\n| `/leads/:id` | PATCH | Update lead fields |\n| `/leads/:id/move` | PUT | Move a lead to a different list |\n| `/contacts/:id/archive` | PUT | Archive or unarchive a contact |\n\n## Get Leads\n\n**GET** `/lists/:id/leads?limit=100&skip=0`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params: `limit` (max 100), `skip`\n\n## Add Contacts\n\n**POST** `/contacts`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"list_id\": \"a1b2c3d4-e5f6-7890-abcd-abcdef123456\",\n  \"contacts\": [\n    {\n      \"Email\": \"john@example.com\",\n      \"First_Name\": \"John\",\n      \"Last_Name\": \"Doe\",\n      \"Phone\": \"+1234567890\",\n      \"Company\": \"Acme Inc\",\n      \"Title\": \"VP Sales\",\n      \"Custom_Field\": \"any value\"\n    }\n  ],\n  \"remove_duplicates\": true\n}\n```\n\n> **Privacy**: Only upload leads and files the user has explicitly approved for SalesBlink. Review CSV contents before bulk import to avoid including unrelated private data.\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | List UUID to add leads to |\n| `contacts` | object[] | ✅ | Array of lead objects (**max 500 per request**) |\n| `remove_duplicates` | boolean | | Remove duplicate emails after insert |\n\nEach contact object:\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `Email` | string | ✅ | Lead's email address |\n| `First_Name` | string | | First name |\n| `Last_Name` | string | | Last name |\n| `Phone` | string | | Phone number |\n| `Company` | string | | Company name |\n| `Title` | string | | Job title |\n| _(any key)_ | string | | Custom fields are supported |\n\n> **Field naming**: Use **PascalCase with underscores** (`First_Name`, `Last_Name`, `Email`).\n\n## Remove Contact\n\n**POST** `/contacts/remove`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"list_id\": \"a1b2c3d4-e5f6-7890-abcd-abcdef123456\",\n  \"email\": \"john@example.com\"\n}\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | List UUID |\n| `email` | string | ✅ | Email address of the lead to remove |\n\n## Update Lead\n\n**PATCH** `/leads/:id` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"First_Name\": \"Updated\",\n  \"Last_Name\": \"Name\",\n  \"Title\": \"CTO\"\n}\n```\n\nAny standard or custom contact fields can be updated. System fields (`_id`, `id`, `list_id`, `account_id`, `user_id`, `accuracy`, `provider`, `custom_fields`, `removed_sequences`, `verification_required`, `archive_invalid_contacts`, `archive_risky_contacts`, `processing`, `completed`, `completedAt`, `last_modified`, `created_date`, `verification_blocked`, `didOpen`, `didClick`, `didReply`, `contactStats`, `retryCount`, `esg_name`, `archived`, `deleted`) **cannot** be modified.\n\nIf updating `Email`, it is automatically lowercased.\n\n## Move Lead\n\n**PUT** `/leads/:id/move` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"list_id\": \"destination_list_uuid\" }\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | Destination list UUID |\n\n## Archive Contact\n\n**PUT** `/contacts/:id/archive`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"archived\": true }\n```\n\n> ⚠️ **The `:id` here is a MongoDB ObjectId** (24-char hex), NOT a UUID. This is the only contact endpoint that uses ObjectId.\n\nFile v1.0.9:references/dfy.md\n\n# Done-For-You (DFY) — Domains & Mailboxes\n\nUse these endpoints to purchase domains and provision Google Workspace / Microsoft 365 mailboxes with full deliverability setup.\n\n> **Prerequisites**: A saved payment method is required. Trial plans cannot place DFY orders.\n>\n> **Payment Safety**: Treat all DFY order, mailbox, and billing actions as payment-sensitive. Before placing any order, obtain explicit user approval of the exact domain names, mailbox counts, provider, price, and cancellation limits. Do not place orders unless explicitly requested.\n\n## Endpoints\n\n| Endpoint                                    | Method | Description                                        |\n| ------------------------------------------- | ------ | -------------------------------------------------- |\n| `/domains/search`                           | GET    | Search available .com domains for DFY purchase     |\n| `/dfy/orders`                               | POST   | Place a new DFY domain + mailbox order             |\n| `/dfy/orders`                               | GET    | List all DFY orders                                |\n| `/dfy/orders/:orderId/mailboxes`            | POST   | Add mailboxes to an existing order                 |\n| `/dfy/orders/:orderId/mailboxes/:mailboxId` | DELETE | Cancel a mailbox (returns billing management link) |\n\n## Search Domains\n\n**GET** `/domains/search`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params:\n- `keyword` (required) — domain name to search (e.g. `mybrand` or `mybrand.com`). Only `.com` domains are supported.\n\nReturns up to 10 available `.com` domains with pricing and workspace availability.\n\nResponse:\n```json\n{\n  \"success\": true,\n  \"message\": \"Domain search completed successfully\",\n  \"data\": [\n    {\n      \"domain\": \"mybrand.com\",\n      \"price\": 15.00,\n      \"status\": \"available\",\n      \"google_workspace_available\": true,\n      \"ms365_workspace_available\": true\n    }\n  ]\n}\n```\n\n## Place DFY Order\n\n**POST** `/dfy/orders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\n### Provider-specific payloads\n\n#### Google Workspace (buy domain)\n\n```json\n{\n  \"domains\": [\n    {\n      \"domain\": \"mybrand.com\",\n      \"isConnect\": false,\n      \"mailboxes\": [\n        { \"username\": \"john\", \"firstName\": \"John\", \"lastName\": \"Doe\" },\n        { \"username\": \"jane\", \"firstName\": \"Jane\", \"lastName\": \"Smith\" }\n      ]\n    }\n  ],\n  \"type\": \"google\",\n  \"password\": \"SecurePass123!\",\n  \"redirectionUrl\": \"https://mybrand.com\"\n}\n```\n\n#### Google Workspace (connect existing domain)\n\n```json\n{\n  \"domains\": [\n    {\n      \"domain\": \"mybrand.com\",\n      \"isConnect\": true\n    }\n  ],\n  \"type\": \"google\",\n  \"password\": \"SecurePass123!\"\n}\n```\n\n#### Microsoft 365 / Outlook (buy domain)\n\n```json\n{\n  \"domains\": [\n    {\n      \"domain\": \"mybrand.com\",\n      \"isConnect\": false,\n      \"mailboxes\": [\n        { \"username\": \"sales\", \"firstName\": \"Sales\", \"lastName\": \"Team\" }\n      ]\n    }\n  ],\n  \"type\": \"outlook\"\n}\n```\n\n#### Azure (100 mailboxes per domain)\n\n```json\n{\n  \"domains\": [\n    {\n      \"domain\": \"mybrand.com\",\n      \"mailboxes\": [\n        { \"username\": \"user001\", \"firstName\": \"User\", \"lastName\": \"001\" },\n        { \"username\": \"user002\", \"firstName\": \"User\", \"lastName\": \"002\" }\n        // ... 98 more mailboxes (exactly 100 total per domain)\n      ]\n    }\n  ],\n  \"type\": \"azure\"\n}\n```\n\n### Fields\n\n| Field              | Type   | Req | Description                                                                                                                            |\n| ------------------ | ------ | --- | -------------------------------------------------------------------------------------------------------------------------------------- |\n| `domains`          | array  | ✅  | Array of domain objects (see below). Buy and Connect domains cannot be mixed.                                                          |\n| `type`             | string | ✅  | Mailbox provider: `google`, `outlook`, or `azure`                                                                                      |\n| `password`         | string |     | **Required for Google.** Common password for ALL mailboxes. Auto-generated if omitted for google buy domains with no custom mailboxes. |\n| `redirectionUrl`   | string |     | Redirect URL for the domain                                                                                                            |\n| `masterInboxEmail` | string |     | Master inbox email for admin access                                                                                                    |\n| `couponCode`       | string |     | Optional Stripe coupon code                                                                                                            |\n\n### Domain object\n\n| Field       | Type    | Req | Description                                                                                                |\n| ----------- | ------- | --- | ---------------------------------------------------------------------------------------------------------- |\n| `domain`    | string  | ✅  | Domain name to purchase or connect                                                                         |\n| `isConnect` | boolean |     | `false` = buy new domain (default), `true` = connect your own existing domain                              |\n| `mailboxes` | array   |     | Array of mailbox objects. Required for all provider types. Each domain needs ≥1 for google/outlook, exactly 100 for azure. Optional for connect-domain orders. |\n\n### Mailbox object\n\n| Field       | Type   | Req | Description                                  |\n| ----------- | ------ | --- | -------------------------------------------- |\n| `username`  | string | ✅  | Mailbox username (with or without `@domain`) |\n| `firstName` | string |     | First name                                   |\n| `lastName`  | string |     | Last name                                    |\n\n### Rules\n\n- You cannot mix buy and connect domains in the same order.\n- For **Google**, `password` is required. Each domain must have at least 1 mailbox in the `mailboxes` array.\n- For **Outlook**, each domain must have at least 1 mailbox in the `mailboxes` array.\n- For **Azure**, each domain must have exactly 100 mailboxes in the `mailboxes` array.\n- For **connect domains** (`isConnect: true`), no `mailboxes` array is needed in the request; the system will provision admin mailboxes automatically.\n- Connect domain orders return `nameservers` in the response. You must update your domain's nameservers before provisioning can begin.\n\n### Response\n\nBuy domain success:\n\n```json\n{\n  \"success\": true,\n  \"message\": \"DFY order placed successfully\",\n  \"data\": {\n    \"id\": \"...\",\n    \"type\": \"google\",\n    \"status\": \"paid\",\n    \"amount\": 23.00,\n    \"domains\": [...],\n    \"nameservers\": null\n  }\n}\n```\n\nConnect domain success:\n\n```json\n{\n  \"success\": true,\n  \"message\": \"DFY order placed successfully\",\n  \"data\": { ... },\n  \"notice\": \"This is a connect domain order. Please update your domain's nameservers...\"\n}\n```\n\n## List DFY Orders\n\n**GET** `/dfy/orders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\nResponse:\n\n```json\n{\n  \"success\": true,\n  \"message\": \"DFY orders retrieved successfully\",\n  \"data\": [\n    {\n      \"id\": \"...\",\n      \"type\": \"google\",\n      \"status\": \"paid\",\n      \"amount\": 23.00,\n      \"domains\": [...],\n      \"nameservers\": null\n    }\n  ]\n}\n```\n\n## Add Mailboxes to Order\n\n**POST** `/dfy/orders/:orderId/mailboxes`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"domainName\": \"mybrand.com\",\n  \"emails\": [\"alice\", \"bob\"],\n  \"password\": \"SecurePass123!\"\n}\n```\n\n| Field        | Type   | Req | Description                              |\n| ------------ | ------ | --- | ---------------------------------------- |\n| `domainName` | string | ✅  | Domain in the order to add mailboxes to  |\n| `emails`     | array  | ✅  | Array of usernames (without `@domain`)   |\n| `password`   | string |     | Password for new mailboxes (Google only) |\n\nRules:\n\n- Cannot add mailboxes to Azure orders.\n- Cannot add mailboxes to a domain where all mailboxes have been cancelled.\n- Duplicate usernames are rejected.\n\n## Cancel Mailbox\n\n**DELETE** `/dfy/orders/:orderId/mailboxes/:mailboxId`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\nCancels a mailbox. Returns a billing management login link because subscription changes must be managed from the web UI.\n\nResponse:\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Please manage your mailbox subscription from the billing page.\",\n  \"data\": {\n    \"login_link\": \"https://run.salesblink.io/magic?token=...&redirect=%2Faccount%2Fbilling%3Ftab%3Dsubscriptions\",\n    \"destination\": \"/account/billing?tab=subscriptions\",\n    \"purpose\": \"manage_subscriptions\"\n  }\n}\n```\n\nFile v1.0.9:references/folders.md\n\n# Folders\n\n## Endpoints\n\n| Endpoint   | Method | Description     |\n| ---------- | ------ | --------------- |\n| `/folders` | GET    | List folders    |\n| `/folders` | POST   | Create a folder |\n\n## Get Folders\n\n**GET** `/folders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\n## Create Folder\n\n**POST** `/folders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"name\": \"Q1 Campaigns\",\n  \"type\": \"sequence\"\n}\n```\n\n| Field  | Type   | Req | Description                                               |\n| ------ | ------ | --- | --------------------------------------------------------- |\n| `name` | string | ✅  | Folder name                                               |\n| `type` | string | ✅  | `\"list\"`, `\"template\"`, `\"sequence\"`, or `\"email-sender\"` |\n\n> If `type` contains `\"sender\"`, it is automatically converted to `\"email-sender\"`.\n\nFile v1.0.9:references/inbox-placement.md\n\n# Inbox Placement Tests\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/inbox-placement` | GET | List deliverability tests |\n| `/inbox-placement` | POST | Create a new deliverability test |\n| `/inbox-placement/:id/pause` | PUT | Pause an active **recurring** test |\n| `/inbox-placement/:id` | DELETE | Delete a test |\n\n## Get Tests\n\n**GET** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params:\n\n| Param | Type | Description |\n|-------|------|-------------|\n| `search` | string | Filter by test name (case-insensitive) |\n| `status` | string | Filter by status: `pending`, `running`, `completed`, `stopped` |\n| `mode` | string | Filter by mode: `one-time`, `recurring` |\n| `ownedBy` | string | Filter by user ID |\n| `limit` | integer | Page size (default: 10) |\n| `skip` | integer | Offset (default: 0) |\n| `sortBy` | string | Sort field (default: `created_at`) |\n| `sortType` | integer | `-1` for descending, `1` for ascending |\n\n> Note: filtering by `status=completed` excludes recurring tests since they never truly complete.\n\n## Create Test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | Test name (min 3 characters) |\n| `mode` | string | ✅ | `\"one-time\"` or `\"recurring\"` |\n| `source` | string | ✅ | `\"from-salesblink\"` or `\"from-outside\"` |\n| `sender_id` | string | ✅* | Sender UUID (required when `source=\"from-salesblink\"` or `mode=\"recurring\"`) |\n| `content_type` | string | ✅* | `\"custom\"`, `\"sequence\"`, or `\"template\"` (required when `source=\"from-salesblink\"` or `mode=\"recurring\"`) |\n| `subject` | string | ✅* | Email subject (required when `content_type=\"custom\"`) |\n| `body` | string | ✅* | Email HTML body (required when `content_type=\"custom\"`) |\n| `sequence_id` | string | ✅* | Sequence UUID (required when `content_type=\"sequence\"`) |\n| `template_id` | string | ✅* | Template ObjectId (required when `content_type=\"sequence\"` or `\"template\"`) |\n| `schedule_day` | integer | ✅* | Day of week: `0`=Sunday through `6`=Saturday (required when `mode=\"recurring\"`) |\n| `tracking_uuid` | string | | Optional UUID for `from-outside` tests. Auto-generated if omitted. |\n\n> *Field requirement depends on `source`, `mode`, and `content_type` values.\n\n**Behavior:**\n- **One-time tests** run ~2 minutes after creation by default.\n- **Recurring tests** run weekly on the specified `schedule_day` at 09:00 UTC.\n- **`from-outside` tests** return `seed_emails` in the response — these are the addresses the user must send to.\n- **`from-salesblink` tests** send automatically using the selected sender.\n\n**V1 Wrapper behavior:** When `source=\"from-salesblink\"` is provided without `content_type`:\n- If `subject` and `body` are present → `content_type` becomes `\"custom\"`\n- Otherwise → `content_type` becomes `\"sequence\"` with `sequence_id: \"from_api\"`\n\n### Example: One-time custom content test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Gmail Deliverability Check\",\n  \"mode\": \"one-time\",\n  \"source\": \"from-salesblink\",\n  \"sender_id\": \"sender-uuid-here\",\n  \"content_type\": \"custom\",\n  \"subject\": \"Hello from SalesBlink\",\n  \"body\": \"<p>This is a test email.</p>\"\n}\n```\n\n### Example: Recurring sequence-based test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Weekly Sequence Check\",\n  \"mode\": \"recurring\",\n  \"source\": \"from-salesblink\",\n  \"sender_id\": \"sender-uuid-here\",\n  \"content_type\": \"sequence\",\n  \"sequence_id\": \"sequence-uuid-here\",\n  \"template_id\": \"507f1f77bcf86cd799439011\",\n  \"schedule_day\": 1\n}\n```\n\n### Example: From-outside test (returns seed emails)\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"External Send Test\",\n  \"mode\": \"one-time\",\n  \"source\": \"from-outside\"\n}\n```\n\nResponse for `from-outside`:\n```json\n{\n  \"success\": true,\n  \"data\": { \"id\": \"...\", \"tracking_uuid\": \"...\", ... },\n  \"seed_emails\": [\"seed1@test.com\", \"seed2@test.com\", ...]\n}\n```\n\n## Pause Test\n\n**PUT** `/inbox-placement/:id/pause`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nOnly works on **recurring** tests. Sets status to `stopped` and clears scheduling.\n\n## Delete Test\n\n**DELETE** `/inbox-placement/:id`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nDeletes the test and all associated tracking tasks.\n\nFile v1.0.9:references/inbox.md\n\n# Inbox & Outreach\n\n## Endpoints\n\n| Endpoint                   | Method | Description                                     |\n| -------------------------- | ------ | ----------------------------------------------- |\n| `/inbox`                   | GET    | Retrieve inbox threads                          |\n| `/inbox/:messageId/thread` | GET    | Get all messages in a specific thread           |\n| `/inbox/:messageId/reply`  | POST   | Reply to a lead's email                         |\n| `/inbox/:messageId`        | PATCH  | Mark as read/unread, set outcome classification |\n\n## Get Inbox\n\n**GET** `/inbox`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params:\n\n| Param      | Type    | Description                                               |\n| ---------- | ------- | --------------------------------------------------------- |\n| `type`     | string  | `all` (replies, default), `draft`, `scheduled`, or `sent` |\n| `limit`    | integer | Max 100 (default: 10)                                     |\n| `skip`     | integer | Offset (default: 0)                                       |\n| `sequence` | string  | Filter by sequence UUID                                   |\n| `outcome`  | string  | Filter by outcome classification                          |\n| `search`   | string  | Search in body, subject, or email address                 |\n| `date`     | string  | Date range as `startTimestamp-endTimestamp`               |\n| `sender`   | string  | Filter by sender ID                                       |\n| `owned_by` | string  | Filter by user email (owners/admins only)                 |\n\n```\nGET /inbox?type=all&limit=50&skip=0\nGET /inbox?type=sent&sequence=SEQ_ID&limit=100\nGET /inbox?search=acme&limit=20\n```\n\nResponse includes `data.result` (thread array), `totalCount`, `count`, and `messageIDs`.\n\n## Get Thread\n\n**GET** `/inbox/:messageId/thread`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\nReturns all messages in a conversation thread, sorted newest first.\n\n## Reply to Email\n\n**POST** `/inbox/:messageId/reply`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"content\": \"<p>Thanks for getting back to me! Let's schedule a call.</p>\",\n  \"cc\": \"manager@company.com\"\n}\n```\n\n| Field              | Type    | Req | Description                                             |\n| ------------------ | ------- | --- | ------------------------------------------------------- |\n| `content`          | string  | ✅  | HTML content of the reply                               |\n| `cc`               | string  |     | Optional CC email address                               |\n| `bcc`              | string  |     | Optional BCC email address                              |\n| `scheduled_time`   | integer |     | Schedule at this timestamp (ms). Defaults to ~20s delay |\n| `tzMode`           | string  |     | Timezone mode: `\"sequence\"` or `\"custom\"`               |\n| `selectedTimezone` | string  |     | Timezone identifier if tzMode is custom                 |\n\n> Attachments are supported via FormData field `attachment`. Base64 images in HTML are automatically uploaded to S3.\n> The reply is automatically sent from the same sender that originally contacted the lead.\n\n## Update Mail State\n\n**PATCH** `/inbox/:messageId`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"unread\": false,\n  \"outcome\": \"interested\"\n}\n```\n\n| Field     | Type    | Description                                                                                                                                                              |\n| --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `unread`  | boolean | Mark as read (`false`) or unread (`true`)                                                                                                                                |\n| `outcome` | string  | Classify the reply: `\"interested\"`, `\"not-interested\"`, `\"automatic-response\"`, `\"meeting-request\"`, `\"out-of-office\"`, `\"do-not-contact\"`, `\"wrong-person\"`, `\"closed\"` |\n\nFile v1.0.9:references/lists.md\n\n# Lists\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/lists` | GET | Retrieve all lists. Query: `limit` (max 100), `skip`, `owned_by` |\n| `/lists/:id` | GET | Get a specific list by UUID |\n| `/lists/:id/leads` | GET | Get leads in a list. Query: `limit` (max 100), `skip` |\n| `/lists` | POST | Create a new list |\n| `/lists/:id` | PATCH | Update a list |\n| `/lists/:id/archive` | PUT | Archive or unarchive a list |\n\n## Create List\n\n**POST** `/lists`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Q1 Prospects\",\n  \"removeDuplicates\": {\n    \"inThisList\": true,\n    \"inOtherLists\": true\n  }\n}\n```\n\nRequired fields marked with ✅:\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | List name |\n| `folder` | string | | Folder ID (UUID) |\n| `starred` | boolean | | Star the list (default: false) |\n| `verification` | boolean | | Enable email verification ⚠️ **IRREVERSIBLE** |\n| `archive_invalid` | boolean | | Auto-archive invalid emails ⚠️ **IRREVERSIBLE** |\n| `archive_risky` | boolean | | Auto-archive risky emails ⚠️ **IRREVERSIBLE** |\n| `removeDuplicates.inThisList` | boolean | | Remove duplicate emails within this list |\n| `removeDuplicates.inOtherLists` | boolean | | Remove contacts that exist in other lists |\n| `removeDuplicates.inTeamMembersLists` | boolean | | Remove contacts that exist in team members' lists |\n\n## Update List\n\n**PATCH** `/lists/:id` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Q2 Prospects Restructured\",\n  \"starred\": true,\n  \"archive_invalid\": true\n}\n```\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `name` | string | New name |\n| `starred` | boolean | Star or unstar |\n| `duplicate_removal` | boolean | Remove duplicates from this list |\n| `duplicate_removal_other_list` | boolean | Remove contacts in other lists |\n| `duplicate_removal_team_list` | boolean | Remove contacts in team members' lists |\n| `verification` | boolean | Enable verification ⚠️ **IRREVERSIBLE** |\n| `archive_invalid` | boolean | Archive invalid emails ⚠️ **IRREVERSIBLE** |\n| `archive_risky` | boolean | Archive risky emails ⚠️ **IRREVERSIBLE** |\n\n> Use `PUT /lists/:id/archive` for archiving — not this endpoint.\n\n## Archive List\n\n**PUT** `/lists/:id/archive`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"archived\": true }\n```\n\nSet `\"archived\": false` to unarchive.\n\nArchive v1.0.8: 18 files, 24186 bytes\n\nFiles: references/account-config.md (419b), references/activity.md (1350b), references/api-keys.md (1444b), references/billing.md (1107b), references/contacts.md (3692b), references/dfy.md (8584b), references/folders.md (910b), references/inbox-placement.md (4673b), references/inbox.md (4245b), references/lists.md (2623b), references/organization.md (2191b), references/reports.md (780b), references/senders.md (5948b), references/sequences.md (6308b), references/templates.md (2615b), references/workflows.md (3584b), SKILL.md (10986b), _meta.json (140b)\n\nFile v1.0.8:SKILL.md\n\n---\nname: cold-email-salesblink\ndescription: >\n  Run cold email sequences on autopilot and manage full sales outreach campaigns via the SalesBlink API.\n  Use this skill to build automated multi-step email campaigns (sequences), manage leads and email lists,\n  create reusable templates with merge variables and spintax, connect sending accounts (Gmail, Outlook, SMTP),\n  handle inbox replies, and track campaign analytics (opens, clicks, replies, sent).\n  Also supports bulk contact imports, email deliverability testing (inbox placement / spam checks),\n  sender warmup links, workspace/team management, and any HTTP request to the SalesBlink platform.\ncompatibility: >\n  Requires network access to run.salesblink.io and a SALESBLINK_API_KEY.\n  Supports any HTTP client (curl, Node.js fetch, Python requests, PowerShell, etc.).\n  No prior knowledge of SalesBlink is needed: the skill guides you through connecting email accounts,\n  importing leads, writing templates, building sequences, launching campaigns, and monitoring deliverability.\nmetadata:\n  openclaw:\n    requires:\n      env:\n        - SALESBLINK_API_KEY\n    primaryEnv: SALESBLINK_API_KEY\n---\n\n# SalesBlink Public REST API v1.0.0\n\n## When to use this skill\n\nUse this skill when the user wants to:\n\n- Create, update, or manage email lists, sequences, templates, or senders\n- Add, update, move, or remove contacts/leads\n- Send or reply to emails via the inbox\n- Check campaign analytics (opens, clicks, replies, sent)\n- Set up outreach campaigns end-to-end\n- Manage workspaces, users, folders, or deliverability tests\n- Make any HTTP request to `run.salesblink.io/api/public/v1.0.0`\n\n## Gotchas\n\n- **ID types matter**: Templates and contact archive use MongoDB ObjectId (24-char hex). All other entities use UUID v4.\n- **messageId** is the RFC822 Message-ID (e.g. `<id@domain.com>`) or Microsoft Graph ID. **Crucial:** Always URL-encode this ID when using it as a path parameter (e.g. in `/inbox/:messageId/thread`). This is distinct from the internal UUID `id`.\n- **`senders` is a comma-separated string**, not an array. It can mix sender IDs and folder IDs — the server auto-detects each.\n- **Sequence `steps` fully replace on PATCH**. Send the complete desired array.\n- **Verification flags are IRREVERSIBLE**: `verification`, `archive_invalid`, `archive_risky` on lists can only be turned ON, never OFF.\n- **Sequences default to paused**: If `paused` is omitted on create, it defaults to `true`.\n- **`launchTimingMode: \"now\"` starts in 5 minutes**, not instantly.\n- **Template attachments use FormData field `attachment`** (not `attachments`). Max 3 per template.\n- **Remove template attachments via `remove_attachments`** array of file **names**.\n- **Adding SMTP sender requires `from_email`**, not `email`.\n- **If an endpoint for a specific task is not mentioned then tell the user that the endpoint is not available**\n- **If user does not have a list, ask them for a CSV file, or list of lead emails with data.**\n- **If email sender is not connected, help them connect one using APIs.**\n- **When asked to create a sequence or campaign for cold email outreach, first ask them about their ICP, Offer, and other details.**\n\n## Base URL\n\n`https://run.salesblink.io/api/public/v1.0.0`\n\n## Authentication\n\nAsk the user for their SALESBLINK_API_KEY: `https://run.salesblink.io/account/integration/api`\n\nPass it in every request as the `Authorization` header (no \"Bearer\" prefix):\n\n**Header:** `Authorization: key-****`\n\n## Rate Limits\n\n| Method        | Limit | Window     |\n| ------------- | ----- | ---------- |\n| GET           | 30    | per minute |\n| POST / PATCH  | 15    | per minute |\n| PUT (archive) | 10    | per minute |\n\nOn `429 Too Many Requests`: wait at least 60 seconds before retrying. For batch operations, insert a 4-second delay between requests.\n\n## Public Signup\n\n**POST** `/signup`\n\nCreate a new SalesBlink account. This is a public endpoint and does not require an API key. **Successful signup returns an API key**, allowing you to proceed with authenticated requests immediately.\n\n**Request Body:**\n```json\n{\n  \"email\": \"user@example.com\",\n  \"password\": \"SecurePassword123\",\n  \"name\": \"John Doe\"\n}\n```\n\n**Response Body:**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"account_id\": \"...\",\n    \"user_id\": \"...\",\n    \"api_key\": \"key-...\"\n  }\n}\n```\n\n**Constraints:**\n- `password`: Min 8 characters, max 48 characters, at least one uppercase and one lowercase letter.\n- **Rate Limit**: 2 signups per day.\n\n## Pagination\n\nMost list endpoints use `limit` (max 100) and `skip`. Activity endpoints (`/sent`, `/opens`, `/clicks`, `/replies`) use `per_page` (max 100) and `page` (1-indexed).\n\nAlways paginate. Never assume a single request returns all data.\n\n## Endpoint Categories\n\nRead the relevant reference file before performing operations in that domain:\n\n- **Lists & contacts/leads** → [references/lists.md](references/lists.md) and [references/contacts.md](references/contacts.md)\n  - Use these endpoints when the user wants to fetch or manage lists that contain leads/contacts. A list is a container for contacts/leads. Each contact/lead contains fields like Email, First_Name, Last_Name, Phone, Company, Title, and custom fields. Contacts are added to lists in batches (up to 500 per request), can be moved between lists, updated, or removed.\n\n- **Email templates** → [references/templates.md](references/templates.md)\n  - Use these endpoints when the user wants to create or manage reusable email templates. A template has a name, subject_line, and HTML content that supports merge variables like {{first_name}} and {{company}}. Templates can have up to 3 attachments and are referenced by sequences when building outreach steps.\n\n- **Sequences & email campaigns** → [references/sequences.md](references/sequences.md)\n  - Use these endpoints when the user wants to create or manage automated email campaigns (sequences). A sequence connects lists (who to email), senders (which accounts send), and templates (what to send) into a timed step-by-step workflow. Steps alternate between email sends and delay periods. Sequences can be launched, paused, resumed, cloned, or archived.\n\n- **Senders, OAuth & warmup links** → [references/senders.md](references/senders.md)\n  - Use these endpoints when the user wants to connect or manage email sending accounts. A sender is an email account (SMTP/IMAP or OAuth-connected Gmail/Outlook) that sends emails on behalf of sequences. Multiple senders can be assigned to a sequence. Senders can also be organized into folders. Warmup links are used in email warmup processes to improve deliverability.\n\n- **Inbox & replies** → [references/inbox.md](references/inbox.md)\n  - Use these endpoints when the user wants to view or interact with email conversations. The inbox contains reply threads, sent emails, scheduled emails, and drafts. Each thread has a messageId. The user can reply to a lead's email, mark messages as read/unread, or classify outcomes.\n\n- **Activity tracking** → [references/activity.md](references/activity.md)\n  - Use these endpoints when the user wants to query engagement events. The system tracks four event types: sent (emails sent), opens (emails opened), clicks (links clicked), and replies (responses received). Events can be filtered by sequence, recipient email, and date range.\n\n- **Users & workspaces** → [references/organization.md](references/organization.md)\n  - Use these endpoints when the user wants to manage team membership or workspaces. A workspace is an account boundary. Users have roles (client, user, admin, developer). Only owners and admins can invite users or create workspaces.\n\n- **Folders** → [references/folders.md](references/folders.md)\n  - Use these endpoints when the user wants to organize resources into folders. Folders have a type (list, template, sequence, or email-sender) and group related resources together for easier management.\n\n- **Domains & signatures** → [references/account-config.md](references/account-config.md)\n  - Use these endpoints when the user wants to view account-level configuration. Custom tracking domains are used for click tracking in emails. Signatures are appended to outgoing emails.\n\n- **DFY domains & mailboxes** → [references/dfy.md](references/dfy.md)\n  - Use these endpoints when the user wants to purchase domains and provision mailboxes through the Done-For-You service. Start with `/domains/search` to find available domains, then place an order with Google Workspace, Outlook, or Azure mailboxes. Supports buying new domains or connecting existing ones.\n\n- **Billing & payment methods** → [references/billing.md](references/billing.md)\n  - Use these endpoints when the user wants to add or remove a saved payment card. Returns magic login links to the billing page.\n\n- **API Key Management** → [references/api-keys.md](references/api-keys.md)\n  - Use these endpoints when the user wants to manage API keys. Users can list all keys, create new keys, refresh an existing key (which generates a new one and revokes the old one), or delete a key.\n\n- **Reports** → [references/reports.md](references/reports.md)\n  - Use these endpoints when the user wants to fetch aggregated activity reports over a date range. Reports combine data across campaigns into summary views.\n\n- **Inbox placement tests** → [references/inbox-placement.md](references/inbox-placement.md)\n  - Use these endpoints when the user wants to test email deliverability. An inbox placement test sends a test email to seed email addresses across providers (Gmail, Outlook, etc.) and reports whether the email landed in inbox, spam, promotions, or other tabs. Tests can be one-time or recurring.\n\n- **End-to-end workflow examples** → [references/workflows.md](references/workflows.md)\n  - Use this reference when the user wants to set up a complete outreach campaign from scratch. It shows the full chain: create list → add contacts → create templates → fetch senders → create sequence → launch.\n\n## Error Handling\n\nAlways check the `success` boolean in the response body. A `200` status can still return `{ success: false, message: \"...\" }`.\n\n| Status | Meaning      | Action                                                |\n| ------ | ------------ | ----------------------------------------------------- |\n| 200    | Success      | Check `success` field                                 |\n| 400    | Bad request  | Re-check payload structure against the reference file |\n| 401    | Unauthorized | Verify API key                                        |\n| 403    | Forbidden    | Insufficient permissions (role too low)               |\n| 404    | Not found    | Verify the ID / endpoint                              |\n| 409    | Conflict     | Resource already exists or connection failed          |\n| 429    | Rate limited | Wait 60s, then retry                                  |\n| 500    | Server error | Retry once after 10s                                  |\n\nFile v1.0.8:_meta.json\n\n{\n  \"ownerId\": \"kn7fnmjb3nqezc1gc8b74fmgrh84rx5t\",\n  \"slug\": \"cold-email-salesblink\",\n  \"version\": \"1.0.8\",\n  \"publishedAt\": 1778689837843\n}\n\nFile v1.0.8:references/account-config.md\n\n# Account Config — Domains & Signatures\n\n## Domains\n\n**GET** `/domains`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList custom tracking domains for the account.\n\n## Signatures\n\n**GET** `/signatures`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList email signatures.\n\n> Signature IDs can be referenced when adding senders via the `signature_id` field. You can pass either the signature ID or its name.\n\nFile v1.0.8:references/activity.md\n\n# Activity Tracking\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/sent` | GET | Log of all sent emails |\n| `/opens` | GET | Email open events |\n| `/clicks` | GET | Link click events |\n| `/replies` | GET | Reply events |\n\n## Query Parameters\n\nAll activity endpoints support:\n\n| Param | Type | Description |\n|-------|------|-------------|\n| `per_page` | integer | Max 100 |\n| `page` | integer | 1-indexed |\n| `sequence_id` | string | Filter by sequence UUID |\n| `recipient_email_address` | string | Filter by email address |\n| `since` | integer | Filter events after this timestamp (ms) |\n| `from` | integer | Start of date range (timestamp, ms) |\n| `to` | integer | End of date range (timestamp, ms) |\n\n> Use `per_page` and `page` for activity endpoints — not `limit`/`skip`.\n\n## Response Format\n\nEach event includes:\n```json\n{\n  \"id\": \"...\",\n  \"time\": 1715000000000,\n  \"message\": \"Sent\",\n  \"type\": \"outreach\",\n  \"sequence\": \"sequence-uuid\",\n  \"email\": \"lead@example.com\",\n  \"sequence_name\": \"Campaign Name\"\n}\n```\n\nFor clicks and replies, `template_name` is also included.\n\n## Examples\n\n**GET** `/opens?sequence_id=SEQ_ID&per_page=100&page=1`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\n**GET** `/replies?since=TIMESTAMP_30_DAYS_AGO&per_page=100`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nFile v1.0.8:references/api-keys.md\n\n# API Key Management\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/keys` | GET | List all API keys for the account |\n| `/keys` | POST | Create a new API key |\n| `/keys/:id/refresh` | POST | Refresh an existing API key (deletes old, creates new) |\n| `/keys/:id` | DELETE | Delete an API key |\n\n## Get API Keys\n\n**GET** `/keys`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nReturns a list of all API keys associated with the account.\n\n## Create API Key\n\n**POST** `/keys`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"name\": \"Zapier Integration\" }\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | A descriptive name for the API key |\n\n## Refresh API Key\n\n**POST** `/keys/:id/refresh`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nThis endpoint generates a new API key and deletes the old one identified by `:id`. \n\n> [!WARNING]\n> If you refresh the key you are currently using, you must update your integration immediately as the old key will be revoked.\n\n## Delete API Key\n\n**DELETE** `/keys/:id`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nDeletes the specified API key.\n\n> [!IMPORTANT]\n> - You cannot delete the API key you are currently using.\n> - At least one API key is required per account. If you want to replace your only key, use the Refresh endpoint instead.\n\nFile v1.0.8:references/billing.md\n\n# Billing & Payment Methods\n\n## Add Card Login Link\n\n**POST** `/billing/add-card`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nGenerates a time-limited magic login link that redirects the user to the billing page where they can add a payment card.\n\nResponse:\n```json\n{\n  \"success\": true,\n  \"message\": \"Add card login link generated successfully\",\n  \"data\": {\n    \"login_link\": \"https://run.salesblink.io/magic?token=...&redirect=%2Faccount%2Fbilling%3Ftab%3Dcard\",\n    \"destination\": \"/account/billing?tab=card\",\n    \"purpose\": \"add_card\"\n  }\n}\n```\n\n## Remove Card Login Link\n\n**POST** `/billing/remove-card`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nGenerates a time-limited magic login link that redirects the user to the billing page where they can remove their saved payment card.\n\nResponse:\n```json\n{\n  \"success\": true,\n  \"message\": \"Remove card login link generated successfully\",\n  \"data\": {\n    \"login_link\": \"https://run.salesblink.io/magic?token=...&redirect=%2Faccount%2Fbilling%3Ftab%3Dcard\",\n    \"destination\": \"/account/billing?tab=card\",\n    \"purpose\": \"remove_card\"\n  }\n}\n```\n\nFile v1.0.8:references/contacts.md\n\n# Contacts & Leads\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/lists/:id/leads` | GET | Get leads in a list (paginated) |\n| `/contacts` | POST | Add up to 500 leads to a list |\n| `/contacts/remove` | POST | Remove a single lead by email from a list |\n| `/leads/:id` | PATCH | Update lead fields |\n| `/leads/:id/move` | PUT | Move a lead to a different list |\n| `/contacts/:id/archive` | PUT | Archive or unarchive a contact |\n\n## Get Leads\n\n**GET** `/lists/:id/leads?limit=100&skip=0`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params: `limit` (max 100), `skip`\n\n## Add Contacts\n\n**POST** `/contacts`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"list_id\": \"a1b2c3d4-e5f6-7890-abcd-abcdef123456\",\n  \"contacts\": [\n    {\n      \"Email\": \"john@example.com\",\n      \"First_Name\": \"John\",\n      \"Last_Name\": \"Doe\",\n      \"Phone\": \"+1234567890\",\n      \"Company\": \"Acme Inc\",\n      \"Title\": \"VP Sales\",\n      \"Custom_Field\": \"any value\"\n    }\n  ],\n  \"remove_duplicates\": true\n}\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | List UUID to add leads to |\n| `contacts` | object[] | ✅ | Array of lead objects (**max 500 per request**) |\n| `remove_duplicates` | boolean | | Remove duplicate emails after insert |\n\nEach contact object:\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `Email` | string | ✅ | Lead's email address |\n| `First_Name` | string | | First name |\n| `Last_Name` | string | | Last name |\n| `Phone` | string | | Phone number |\n| `Company` | string | | Company name |\n| `Title` | string | | Job title |\n| _(any key)_ | string | | Custom fields are supported |\n\n> **Field naming**: Use **PascalCase with underscores** (`First_Name`, `Last_Name`, `Email`).\n\n## Remove Contact\n\n**POST** `/contacts/remove`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"list_id\": \"a1b2c3d4-e5f6-7890-abcd-abcdef123456\",\n  \"email\": \"john@example.com\"\n}\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | List UUID |\n| `email` | string | ✅ | Email address of the lead to remove |\n\n## Update Lead\n\n**PATCH** `/leads/:id` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"First_Name\": \"Updated\",\n  \"Last_Name\": \"Name\",\n  \"Title\": \"CTO\"\n}\n```\n\nAny standard or custom contact fields can be updated. System fields (`_id`, `id`, `list_id`, `account_id`, `user_id`, `accuracy`, `provider`, `custom_fields`, `removed_sequences`, `verification_required`, `archive_invalid_contacts`, `archive_risky_contacts`, `processing`, `completed`, `completedAt`, `last_modified`, `created_date`, `verification_blocked`, `didOpen`, `didClick`, `didReply`, `contactStats`, `retryCount`, `esg_name`, `archived`, `deleted`) **cannot** be modified.\n\nIf updating `Email`, it is automatically lowercased.\n\n## Move Lead\n\n**PUT** `/leads/:id/move` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"list_id\": \"destination_list_uuid\" }\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | Destination list UUID |\n\n## Archive Contact\n\n**PUT** `/contacts/:id/archive`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"archived\": true }\n```\n\n> ⚠️ **The `:id` here is a MongoDB ObjectId** (24-char hex), NOT a UUID. This is the only contact endpoint that uses ObjectId.\n\nFile v1.0.8:references/dfy.md\n\n# Done-For-You (DFY) — Domains & Mailboxes\n\nUse these endpoints to purchase domains and provision Google Workspace / Microsoft 365 mailboxes with full deliverability setup.\n\n> **Prerequisites**: A saved payment method is required. Trial plans cannot place DFY orders.\n\n## Endpoints\n\n| Endpoint                                    | Method | Description                                        |\n| ------------------------------------------- | ------ | -------------------------------------------------- |\n| `/domains/search`                           | GET    | Search available .com domains for DFY purchase     |\n| `/dfy/orders`                               | POST   | Place a new DFY domain + mailbox order             |\n| `/dfy/orders`                               | GET    | List all DFY orders                                |\n| `/dfy/orders/:orderId/mailboxes`            | POST   | Add mailboxes to an existing order                 |\n| `/dfy/orders/:orderId/mailboxes/:mailboxId` | DELETE | Cancel a mailbox (returns billing management link) |\n\n## Search Domains\n\n**GET** `/domains/search`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params:\n- `keyword` (required) — domain name to search (e.g. `mybrand` or `mybrand.com`). Only `.com` domains are supported.\n\nReturns up to 10 available `.com` domains with pricing and workspace availability.\n\nResponse:\n```json\n{\n  \"success\": true,\n  \"message\": \"Domain search completed successfully\",\n  \"data\": [\n    {\n      \"domain\": \"mybrand.com\",\n      \"price\": 15.00,\n      \"status\": \"available\",\n      \"google_workspace_available\": true,\n      \"ms365_workspace_available\": true\n    }\n  ]\n}\n```\n\n## Place DFY Order\n\n**POST** `/dfy/orders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\n### Provider-specific payloads\n\n#### Google Workspace (buy domain)\n\n```json\n{\n  \"domains\": [\n    {\n      \"domain\": \"mybrand.com\",\n      \"isConnect\": false,\n      \"mailboxes\": [\n        { \"username\": \"john\", \"firstName\": \"John\", \"lastName\": \"Doe\" },\n        { \"username\": \"jane\", \"firstName\": \"Jane\", \"lastName\": \"Smith\" }\n      ]\n    }\n  ],\n  \"type\": \"google\",\n  \"password\": \"SecurePass123!\",\n  \"redirectionUrl\": \"https://mybrand.com\"\n}\n```\n\n#### Google Workspace (connect existing domain)\n\n```json\n{\n  \"domains\": [\n    {\n      \"domain\": \"mybrand.com\",\n      \"isConnect\": true\n    }\n  ],\n  \"type\": \"google\",\n  \"password\": \"SecurePass123!\"\n}\n```\n\n#### Microsoft 365 / Outlook (buy domain)\n\n```json\n{\n  \"domains\": [\n    {\n      \"domain\": \"mybrand.com\",\n      \"isConnect\": false,\n      \"mailboxes\": [\n        { \"username\": \"sales\", \"firstName\": \"Sales\", \"lastName\": \"Team\" }\n      ]\n    }\n  ],\n  \"type\": \"outlook\"\n}\n```\n\n#### Azure (100 mailboxes per domain)\n\n```json\n{\n  \"domains\": [\n    {\n      \"domain\": \"mybrand.com\",\n      \"mailboxes\": [\n        { \"username\": \"user001\", \"firstName\": \"User\", \"lastName\": \"001\" },\n        { \"username\": \"user002\", \"firstName\": \"User\", \"lastName\": \"002\" }\n        // ... 98 more mailboxes (exactly 100 total per domain)\n      ]\n    }\n  ],\n  \"type\": \"azure\"\n}\n```\n\n### Fields\n\n| Field              | Type   | Req | Description                                                                                                                            |\n| ------------------ | ------ | --- | -------------------------------------------------------------------------------------------------------------------------------------- |\n| `domains`          | array  | ✅  | Array of domain objects (see below). Buy and Connect domains cannot be mixed.                                                          |\n| `type`             | string | ✅  | Mailbox provider: `google`, `outlook`, or `azure`                                                                                      |\n| `password`         | string |     | **Required for Google.** Common password for ALL mailboxes. Auto-generated if omitted for google buy domains with no custom mailboxes. |\n| `redirectionUrl`   | string |     | Redirect URL for the domain                                                                                                            |\n| `masterInboxEmail` | string |     | Master inbox email for admin access                                                                                                    |\n| `couponCode`       | string |     | Optional Stripe coupon code                                                                                                            |\n\n### Domain object\n\n| Field       | Type    | Req | Description                                                                                                |\n| ----------- | ------- | --- | ---------------------------------------------------------------------------------------------------------- |\n| `domain`    | string  | ✅  | Domain name to purchase or connect                                                                         |\n| `isConnect` | boolean |     | `false` = buy new domain (default), `true` = connect your own existing domain                              |\n| `mailboxes` | array   |     | Array of mailbox objects. Required for all provider types. Each domain needs ≥1 for google/outlook, exactly 100 for azure. Optional for connect-domain orders. |\n\n### Mailbox object\n\n| Field       | Type   | Req | Description                                  |\n| ----------- | ------ | --- | -------------------------------------------- |\n| `username`  | string | ✅  | Mailbox username (with or without `@domain`) |\n| `firstName` | string |     | First name                                   |\n| `lastName`  | string |     | Last name                                    |\n\n### Rules\n\n- You cannot mix buy and connect domains in the same order.\n- For **Google**, `password` is required. Each domain must have at least 1 mailbox in the `mailboxes` array.\n- For **Outlook**, each domain must have at least 1 mailbox in the `mailboxes` array.\n- For **Azure**, each domain must have exactly 100 mailboxes in the `mailboxes` array.\n- For **connect domains** (`isConnect: true`), no `mailboxes` array is needed in the request; the system will provision admin mailboxes automatically.\n- Connect domain orders return `nameservers` in the response. You must update your domain's nameservers before provisioning can begin.\n\n### Response\n\nBuy domain success:\n\n```json\n{\n  \"success\": true,\n  \"message\": \"DFY order placed successfully\",\n  \"data\": {\n    \"id\": \"...\",\n    \"type\": \"google\",\n    \"status\": \"paid\",\n    \"amount\": 23.00,\n    \"domains\": [...],\n    \"nameservers\": null\n  }\n}\n```\n\nConnect domain success:\n\n```json\n{\n  \"success\": true,\n  \"message\": \"DFY order placed successfully\",\n  \"data\": { ... },\n  \"notice\": \"This is a connect domain order. Please update your domain's nameservers...\"\n}\n```\n\n## List DFY Orders\n\n**GET** `/dfy/orders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\nResponse:\n\n```json\n{\n  \"success\": true,\n  \"message\": \"DFY orders retrieved successfully\",\n  \"data\": [\n    {\n      \"id\": \"...\",\n      \"type\": \"google\",\n      \"status\": \"paid\",\n      \"amount\": 23.00,\n      \"domains\": [...],\n      \"nameservers\": null\n    }\n  ]\n}\n```\n\n## Add Mailboxes to Order\n\n**POST** `/dfy/orders/:orderId/mailboxes`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"domainName\": \"mybrand.com\",\n  \"emails\": [\"alice\", \"bob\"],\n  \"password\": \"SecurePass123!\"\n}\n```\n\n| Field        | Type   | Req | Description                              |\n| ------------ | ------ | --- | ---------------------------------------- |\n| `domainName` | string | ✅  | Domain in the order to add mailboxes to  |\n| `emails`     | array  | ✅  | Array of usernames (without `@domain`)   |\n| `password`   | string |     | Password for new mailboxes (Google only) |\n\nRules:\n\n- Cannot add mailboxes to Azure orders.\n- Cannot add mailboxes to a domain where all mailboxes have been cancelled.\n- Duplicate usernames are rejected.\n\n## Cancel Mailbox\n\n**DELETE** `/dfy/orders/:orderId/mailboxes/:mailboxId`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\nCancels a mailbox. Returns a billing management login link because subscription changes must be managed from the web UI.\n\nResponse:\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Please manage your mailbox subscription from the billing page.\",\n  \"data\": {\n    \"login_link\": \"https://run.salesblink.io/magic?token=...&redirect=%2Faccount%2Fbilling%3Ftab%3Dsubscriptions\",\n    \"destination\": \"/account/billing?tab=subscriptions\",\n    \"purpose\": \"manage_subscriptions\"\n  }\n}\n```\n\nFile v1.0.8:references/folders.md\n\n# Folders\n\n## Endpoints\n\n| Endpoint   | Method | Description     |\n| ---------- | ------ | --------------- |\n| `/folders` | GET    | List folders    |\n| `/folders` | POST   | Create a folder |\n\n## Get Folders\n\n**GET** `/folders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\n## Create Folder\n\n**POST** `/folders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"name\": \"Q1 Campaigns\",\n  \"type\": \"sequence\"\n}\n```\n\n| Field  | Type   | Req | Description                                               |\n| ------ | ------ | --- | --------------------------------------------------------- |\n| `name` | string | ✅  | Folder name                                               |\n| `type` | string | ✅  | `\"list\"`, `\"template\"`, `\"sequence\"`, or `\"email-sender\"` |\n\n> If `type` contains `\"sender\"`, it is automatically converted to `\"email-sender\"`.\n\nFile v1.0.8:references/inbox-placement.md\n\n# Inbox Placement Tests\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/inbox-placement` | GET | List deliverability tests |\n| `/inbox-placement` | POST | Create a new deliverability test |\n| `/inbox-placement/:id/pause` | PUT | Pause an active **recurring** test |\n| `/inbox-placement/:id` | DELETE | Delete a test |\n\n## Get Tests\n\n**GET** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params:\n\n| Param | Type | Description |\n|-------|------|-------------|\n| `search` | string | Filter by test name (case-insensitive) |\n| `status` | string | Filter by status: `pending`, `running`, `completed`, `stopped` |\n| `mode` | string | Filter by mode: `one-time`, `recurring` |\n| `ownedBy` | string | Filter by user ID |\n| `limit` | integer | Page size (default: 10) |\n| `skip` | integer | Offset (default: 0) |\n| `sortBy` | string | Sort field (default: `created_at`) |\n| `sortType` | integer | `-1` for descending, `1` for ascending |\n\n> Note: filtering by `status=completed` excludes recurring tests since they never truly complete.\n\n## Create Test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | Test name (min 3 characters) |\n| `mode` | string | ✅ | `\"one-time\"` or `\"recurring\"` |\n| `source` | string | ✅ | `\"from-salesblink\"` or `\"from-outside\"` |\n| `sender_id` | string | ✅* | Sender UUID (required when `source=\"from-salesblink\"` or `mode=\"recurring\"`) |\n| `content_type` | string | ✅* | `\"custom\"`, `\"sequence\"`, or `\"template\"` (required when `source=\"from-salesblink\"` or `mode=\"recurring\"`) |\n| `subject` | string | ✅* | Email subject (required when `content_type=\"custom\"`) |\n| `body` | string | ✅* | Email HTML body (required when `content_type=\"custom\"`) |\n| `sequence_id` | string | ✅* | Sequence UUID (required when `content_type=\"sequence\"`) |\n| `template_id` | string | ✅* | Template ObjectId (required when `content_type=\"sequence\"` or `\"template\"`) |\n| `schedule_day` | integer | ✅* | Day of week: `0`=Sunday through `6`=Saturday (required when `mode=\"recurring\"`) |\n| `tracking_uuid` | string | | Optional UUID for `from-outside` tests. Auto-generated if omitted. |\n\n> *Field requirement depends on `source`, `mode`, and `content_type` values.\n\n**Behavior:**\n- **One-time tests** run ~2 minutes after creation by default.\n- **Recurring tests** run weekly on the specified `schedule_day` at 09:00 UTC.\n- **`from-outside` tests** return `seed_emails` in the response — these are the addresses the user must send to.\n- **`from-salesblink` tests** send automatically using the selected sender.\n\n**V1 Wrapper behavior:** When `source=\"from-salesblink\"` is provided without `content_type`:\n- If `subject` and `body` are present → `content_type` becomes `\"custom\"`\n- Otherwise → `content_type` becomes `\"sequence\"` with `sequence_id: \"from_api\"`\n\n### Example: One-time custom content test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Gmail Deliverability Check\",\n  \"mode\": \"one-time\",\n  \"source\": \"from-salesblink\",\n  \"sender_id\": \"sender-uuid-here\",\n  \"content_type\": \"custom\",\n  \"subject\": \"Hello from SalesBlink\",\n  \"body\": \"<p>This is a test email.</p>\"\n}\n```\n\n### Example: Recurring sequence-based test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Weekly Sequence Check\",\n  \"mode\": \"recurring\",\n  \"source\": \"from-salesblink\",\n  \"sender_id\": \"sender-uuid-here\",\n  \"content_type\": \"sequence\",\n  \"sequence_id\": \"sequence-uuid-here\",\n  \"template_id\": \"507f1f77bcf86cd799439011\",\n  \"schedule_day\": 1\n}\n```\n\n### Example: From-outside test (returns seed emails)\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"External Send Test\",\n  \"mode\": \"one-time\",\n  \"source\": \"from-outside\"\n}\n```\n\nResponse for `from-outside`:\n```json\n{\n  \"success\": true,\n  \"data\": { \"id\": \"...\", \"tracking_uuid\": \"...\", ... },\n  \"seed_emails\": [\"seed1@test.com\", \"seed2@test.com\", ...]\n}\n```\n\n## Pause Test\n\n**PUT** `/inbox-placement/:id/pause`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nOnly works on **recurring** tests. Sets status to `stopped` and clears scheduling.\n\n## Delete Test\n\n**DELETE** `/inbox-placement/:id`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nDeletes the test and all associated tracking tasks.\n\nFile v1.0.8:references/inbox.md\n\n# Inbox & Outreach\n\n## Endpoints\n\n| Endpoint                   | Method | Description                                     |\n| -------------------------- | ------ | ----------------------------------------------- |\n| `/inbox`                   | GET    | Retrieve inbox threads                          |\n| `/inbox/:messageId/thread` | GET    | Get all messages in a specific thread           |\n| `/inbox/:messageId/reply`  | POST   | Reply to a lead's email                         |\n| `/inbox/:messageId`        | PATCH  | Mark as read/unread, set outcome classification |\n\n## Get Inbox\n\n**GET** `/inbox`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params:\n\n| Param      | Type    | Description                                               |\n| ---------- | ------- | --------------------------------------------------------- |\n| `type`     | string  | `all` (replies, default), `draft`, `scheduled`, or `sent` |\n| `limit`    | integer | Max 100 (default: 10)                                     |\n| `skip`     | integer | Offset (default: 0)                                       |\n| `sequence` | string  | Filter by sequence UUID                                   |\n| `outcome`  | string  | Filter by outcome classification                          |\n| `search`   | string  | Search in body, subject, or email address                 |\n| `date`     | string  | Date range as `startTimestamp-endTimestamp`               |\n| `sender`   | string  | Filter by sender ID                                       |\n| `owned_by` | string  | Filter by user email (owners/admins only)                 |\n\n```\nGET /inbox?type=all&limit=50&skip=0\nGET /inbox?type=sent&sequence=SEQ_ID&limit=100\nGET /inbox?search=acme&limit=20\n```\n\nResponse includes `data.result` (thread array), `totalCount`, `count`, and `messageIDs`.\n\n## Get Thread\n\n**GET** `/inbox/:messageId/thread`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\nReturns all messages in a conversation thread, sorted newest first.\n\n## Reply to Email\n\n**POST** `/inbox/:messageId/reply`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"content\": \"<p>Thanks for getting back to me! Let's schedule a call.</p>\",\n  \"cc\": \"manager@company.com\"\n}\n```\n\n| Field              | Type    | Req | Description                                             |\n| ------------------ | ------- | --- | ------------------------------------------------------- |\n| `content`          | string  | ✅  | HTML content of the reply                               |\n| `cc`               | string  |     | Optional CC email address                               |\n| `bcc`              | string  |     | Optional BCC email address                              |\n| `scheduled_time`   | integer |     | Schedule at this timestamp (ms). Defaults to ~20s delay |\n| `tzMode`           | string  |     | Timezone mode: `\"sequence\"` or `\"custom\"`               |\n| `selectedTimezone` | string  |     | Timezone identifier if tzMode is custom                 |\n\n> Attachments are supported via FormData field `attachment`. Base64 images in HTML are automatically uploaded to S3.\n> The reply is automatically sent from the same sender that originally contacted the lead.\n\n## Update Mail State\n\n**PATCH** `/inbox/:messageId`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"unread\": false,\n  \"outcome\": \"interested\"\n}\n```\n\n| Field     | Type    | Description                                                                                                                                                              |\n| --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `unread`  | boolean | Mark as read (`false`) or unread (`true`)                                                                                                                                |\n| `outcome` | string  | Classify the reply: `\"interested\"`, `\"not-interested\"`, `\"automatic-response\"`, `\"meeting-request\"`, `\"out-of-office\"`, `\"do-not-contact\"`, `\"wrong-person\"`, `\"closed\"` |\n\nFile v1.0.8:references/lists.md\n\n# Lists\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/lists` | GET | Retrieve all lists. Query: `limit` (max 100), `skip`, `owned_by` |\n| `/lists/:id` | GET | Get a specific list by UUID |\n| `/lists/:id/leads` | GET | Get leads in a list. Query: `limit` (max 100), `skip` |\n| `/lists` | POST | Create a new list |\n| `/lists/:id` | PATCH | Update a list |\n| `/lists/:id/archive` | PUT | Archive or unarchive a list |\n\n## Create List\n\n**POST** `/lists`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Q1 Prospects\",\n  \"removeDuplicates\": {\n    \"inThisList\": true,\n    \"inOtherLists\": true\n  }\n}\n```\n\nRequired fields marked with ✅:\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | List name |\n| `folder` | string | | Folder ID (UUID) |\n| `starred` | boolean | | Star the list (default: false) |\n| `verification` | boolean | | Enable email verification ⚠️ **IRREVERSIBLE** |\n| `archive_invalid` | boolean | | Auto-archive invalid emails ⚠️ **IRREVERSIBLE** |\n| `archive_risky` | boolean | | Auto-archive risky emails ⚠️ **IRREVERSIBLE** |\n| `removeDuplicates.inThisList` | boolean | | Remove duplicate emails within this list |\n| `removeDuplicates.inOtherLists` | boolean | | Remove contacts that exist in other lists |\n| `removeDuplicates.inTeamMembersLists` | boolean | | Remove contacts that exist in team members' lists |\n\n## Update List\n\n**PATCH** `/lists/:id` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Q2 Prospects Restructured\",\n  \"starred\": true,\n  \"archive_invalid\": true\n}\n```\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `name` | string | New name |\n| `starred` | boolean | Star or unstar |\n| `duplicate_removal` | boolean | Remove duplicates from this list |\n| `duplicate_removal_other_list` | boolean | Remove contacts in other lists |\n| `duplicate_removal_team_list` | boolean | Remove contacts in team members' lists |\n| `verification` | boolean | Enable verification ⚠️ **IRREVERSIBLE** |\n| `archive_invalid` | boolean | Archive invalid emails ⚠️ **IRREVERSIBLE** |\n| `archive_risky` | boolean | Archive risky emails ⚠️ **IRREVERSIBLE** |\n\n> Use `PUT /lists/:id/archive` for archiving — not this endpoint.\n\n## Archive List\n\n**PUT** `/lists/:id/archive`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"archived\": true }\n```\n\nSet `\"archived\": false` to unarchive.\n\nArchive v1.0.7: 15 files, 20613 bytes\n\nFiles: references/account-config.md (558b), references/activity.md (1350b), references/contacts.md (3692b), references/folders.md (910b), references/inbox-placement.md (4673b), references/inbox.md (4347b), references/lists.md (2623b), references/organization.md (2944b), references/reports.md (780b), references/senders.md (3935b), references/sequences.md (6615b), references/templates.md (2615b), references/workflows.md (4140b), SKILL.md (10604b), _meta.json (140b)\n\nFile v1.0.7:SKILL.md\n\n---\nname: cold-email-salesblink\ndescription: >\n  Run cold email sequences on autopilot and manage full sales outreach campaigns via the SalesBlink API.\n  Use this skill to build automated multi-step email campaigns (sequences), manage leads and email lists,\n  create reusable templates with merge variables and spintax, connect sending accounts (Gmail, Outlook, SMTP),\n  handle inbox replies, and track campaign analytics (opens, clicks, replies, sent).\n  Also supports bulk contact imports, email deliverability testing (inbox placement / spam checks),\n  and sender warmup links.\ncompatibility: >\n  Requires network access to run.salesblink.io and a SALESBLINK_API_KEY.\n  Supports any HTTP client (curl, Node.js fetch, Python requests, PowerShell, etc.).\n  No prior knowledge of SalesBlink is needed: the skill guides you through connecting email accounts,\n  importing leads, writing templates, building sequences, launching campaigns, and monitoring deliverability.\nmetadata:\n  openclaw:\n    requires:\n      env:\n        - SALESBLINK_API_KEY\n    primaryEnv: SALESBLINK_API_KEY\n    homepage: https://github.com/openclaw/clawhub/tree/main/skills/cold-email-salesblink\n---\n\n# SalesBlink Public REST API v1.0.0\n\n## When to use this skill\n\nUse this skill when the user wants to:\n\n- Create, update, or manage email lists, sequences, templates, or senders\n- Add, update, move, or remove contacts/leads\n- Send or reply to emails via the inbox\n- Check campaign analytics (opens, clicks, replies, sent)\n- Set up outreach campaigns end-to-end\n- Manage folders or deliverability tests\n\n## Guardrails & Required Approvals\n\nThis skill interacts with live SalesBlink account resources and can affect real recipients. Before performing any mutating action, you **must** obtain explicit user confirmation. This includes:\n\n- **POST, PATCH, PUT, DELETE** requests that create, update, or delete sequences, lists, contacts, templates, senders, or campaigns\n- **Sending or replying to emails** via inbox or sequence launch\n- **Archiving** sequences, lists, or templates\n- **Inviting users** or **changing roles** (especially to admin)\n- **Launching or unpausing** sequences\n\n**Default all campaigns to paused.** When creating or cloning a sequence, leave `paused: true` (or omit the field, which defaults to true). Only unpause or set `launchTimingMode` after the user explicitly reviews recipients, templates, senders, and timing, and confirms they want to launch.\n\n**Use a least-privilege API key.** Avoid owner/admin API keys unless absolutely necessary. Prefer keys scoped to campaign management rather than workspace or user management.\n\n**Prefer OAuth over SMTP passwords.** When connecting senders, use Google or Outlook OAuth when possible. If SMTP is required, use app-specific passwords. Never store or log mailbox credentials.\n\n## Gotchas\n\n- **ID types matter**: Templates and contact archive use MongoDB ObjectId (24-char hex). All other entities use UUID v4.\n- **messageId** is the RFC822 Message-ID (e.g. `<id@domain.com>`) or Microsoft Graph ID. **Crucial:** Always URL-encode this ID when using it as a path parameter (e.g. in `/inbox/:messageId/thread`). This is distinct from the internal UUID `id`.\n- **`senders` is a comma-separated string**, not an array. It can mix sender IDs and folder IDs — the server auto-detects each.\n- **Sequence `steps` fully replace on PATCH**. Send the complete desired array.\n- **Verification flags are IRREVERSIBLE**: `verification`, `archive_invalid`, `archive_risky` on lists can only be turned ON, never OFF.\n- **Sequences default to paused**: If `paused` is omitted on create, it defaults to `true`.\n- **`launchTimingMode: \"now\"` starts in 5 minutes**, not instantly.\n- **Template attachments use FormData field `attachment`** (not `attachments`). Max 3 per template.\n- **Remove template attachments via `remove_attachments`** array of file **names**.\n- **Adding SMTP sender requires `from_email`**, not `email`.\n- **If an endpoint for a specific task is not mentioned then tell the user that the endpoint is not available**\n- **If user does not have a list, ask them for a CSV file, or list of lead emails with data.**\n- **If email sender is not connected, help them connect one using APIs.**\n- **When asked to create a sequence or campaign for cold email outreach, first ask them about their ICP, Offer, and other details.**\n\n## Base URL\n\n`https://run.salesblink.io/api/public/v1.0.0`\n\n## Authentication\n\nAsk the user for their SALESBLINK_API_KEY: `https://run.salesblink.io/account/integration/api`\n\nPass it in every request as the `Authorization` header (no \"Bearer\" prefix):\n\n**Header:** `Authorization: key-****`\n\n## Rate Limits\n\n| Method        | Limit | Window     |\n| ------------- | ----- | ---------- |\n| GET           | 30    | per minute |\n| POST / PATCH  | 15    | per minute |\n| PUT (archive) | 10    | per minute |\n\nOn `429 Too Many Requests`: wait at least 60 seconds before retrying. For batch operations, insert a 4-second delay between requests.\n\n## Pagination\n\nMost list endpoints use `limit` (max 100) and `skip`. Activity endpoints (`/sent`, `/opens`, `/clicks`, `/replies`) use `per_page` (max 100) and `page` (1-indexed).\n\nAlways paginate. Never assume a single request returns all data.\n\n## Endpoint Categories\n\nRead the relevant reference file before performing operations in that domain:\n\n- **Lists & contacts/leads** → [references/lists.md](references/lists.md) and [references/contacts.md](references/contacts.md)\n  - Use these endpoints when the user wants to fetch or manage lists that contain leads/contacts. A list is a container for contacts/leads. Each contact/lead contains fields like Email, First_Name, Last_Name, Phone, Company, Title, and custom fields. Contacts are added to lists in batches (up to 500 per request), can be moved between lists, updated, or removed.\n\n- **Email templates** → [references/templates.md](references/templates.md)\n  - Use these endpoints when the user wants to create or manage reusable email templates. A template has a name, subject_line, and HTML content that supports merge variables like {{first_name}} and {{company}}. Templates can have up to 3 attachments and are referenced by sequences when building outreach steps.\n\n- **Sequences & email campaigns** → [references/sequences.md](references/sequences.md)\n  - Use these endpoints when the user wants to create or manage automated email campaigns (sequences). A sequence connects lists (who to email), senders (which accounts send), and templates (what to send) into a timed step-by-step workflow. Steps alternate between email sends and delay periods. Sequences can be launched, paused, resumed, cloned, or archived.\n\n- **Senders & OAuth** → [references/senders.md](references/senders.md)\n  - Use these endpoints when the user wants to connect or manage email sending accounts. A sender is an email account (SMTP/IMAP or OAuth-connected Gmail/Outlook) that sends emails on behalf of sequences. Multiple senders can be assigned to a sequence. Senders can also be organized into folders.\n\n- **Inbox & replies** → [references/inbox.md](references/inbox.md)\n  - Use these endpoints when the user wants to view or interact with email conversations. The inbox contains reply threads, sent emails, scheduled emails, and drafts. Each thread has a messageId. The user can reply to a lead's email, mark messages as read/unread, or classify outcomes.\n\n- **Activity tracking** → [references/activity.md](references/activity.md)\n  - Use these endpoints when the user wants to query engagement events. The system tracks four event types: sent (emails sent), opens (emails opened), clicks (links clicked), and replies (responses received). Events can be filtered by sequence, recipient email, and date range.\n\n- **Users & workspaces** → [references/organization.md](references/organization.md)\n  - Use these endpoints when the user wants to manage team membership or workspaces. A workspace is an account boundary. Users have roles (client, user, admin, developer). Only owners and admins can invite users or create workspaces.\n\n- **Folders** → [references/folders.md](references/folders.md)\n  - Use these endpoints when the user wants to organize resources into folders. Folders have a type (list, template, sequence, or email-sender) and group related resources together for easier management.\n\n- **Domains, signatures & warmup links** → [references/account-config.md](references/account-config.md)\n  - Use these endpoints when the user wants to view account-level configuration. Custom tracking domains are used for click tracking in emails. Signatures are appended to outgoing emails. Warmup links are used in email warmup processes.\n\n- **Reports** → [references/reports.md](references/reports.md)\n  - Use these endpoints when the user wants to fetch aggregated activity reports over a date range. Reports combine data across campaigns into summary views.\n\n- **Inbox placement tests** → [references/inbox-placement.md](references/inbox-placement.md)\n  - Use these endpoints when the user wants to test email deliverability. An inbox placement test sends a test email to seed email addresses across providers (Gmail, Outlook, etc.) and reports whether the email landed in inbox, spam, promotions, or other tabs. Tests can be one-time or recurring.\n\n- **End-to-end workflow examples** → [references/workflows.md](references/workflows.md)\n  - Use this reference when the user wants to set up a complete outreach campaign from scratch. It shows the full chain: create list → add contacts → create templates → fetch senders → create sequence → launch.\n\n## Error Handling\n\nAlways check the `success` boolean in the response body. A `200` status can still return `{ success: false, message: \"...\" }`.\n\n| Status | Meaning      | Action                                                |\n| ------ | ------------ | ----------------------------------------------------- |\n| 200    | Success      | Check `success` field                                 |\n| 400    | Bad request  | Re-check payload structure against the reference file |\n| 401    | Unauthorized | Verify API key                                        |\n| 403    | Forbidden    | Insufficient permissions (role too low)               |\n| 404    | Not found    | Verify the ID / endpoint                              |\n| 409    | Conflict     | Resource already exists or connection failed          |\n| 429    | Rate limited | Wait 60s, then retry                                  |\n| 500    | Server error | Retry once after 10s                                  |\n\nFile v1.0.7:_meta.json\n\n{\n  \"ownerId\": \"kn7fnmjb3nqezc1gc8b74fmgrh84rx5t\",\n  \"slug\": \"cold-email-salesblink\",\n  \"version\": \"1.0.7\",\n  \"publishedAt\": 1778136760495\n}\n\nFile v1.0.7:references/account-config.md\n\n# Account Config — Domains, Signatures & Warmup Links\n\n## Domains\n\n**GET** `/domains`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList custom tracking domains for the account.\n\n## Signatures\n\n**GET** `/signatures`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList email signatures.\n\n> Signature IDs can be referenced when adding senders via the `signature_id` field. You can pass either the signature ID or its name.\n\n## Warmup Links\n\n**GET** `/warmup-links`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList warmup link configurations.\n\nFile v1.0.7:references/activity.md\n\n# Activity Tracking\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/sent` | GET | Log of all sent emails |\n| `/opens` | GET | Email open events |\n| `/clicks` | GET | Link click events |\n| `/replies` | GET | Reply events |\n\n## Query Parameters\n\nAll activity endpoints support:\n\n| Param | Type | Description |\n|-------|------|-------------|\n| `per_page` | integer | Max 100 |\n| `page` | integer | 1-indexed |\n| `sequence_id` | string | Filter by sequence UUID |\n| `recipient_email_address` | string | Filter by email address |\n| `since` | integer | Filter events after this timestamp (ms) |\n| `from` | integer | Start of date range (timestamp, ms) |\n| `to` | integer | End of date range (timestamp, ms) |\n\n> Use `per_page` and `page` for activity endpoints — not `limit`/`skip`.\n\n## Response Format\n\nEach event includes:\n```json\n{\n  \"id\": \"...\",\n  \"time\": 1715000000000,\n  \"message\": \"Sent\",\n  \"type\": \"outreach\",\n  \"sequence\": \"sequence-uuid\",\n  \"email\": \"lead@example.com\",\n  \"sequence_name\": \"Campaign Name\"\n}\n```\n\nFor clicks and replies, `template_name` is also included.\n\n## Examples\n\n**GET** `/opens?sequence_id=SEQ_ID&per_page=100&page=1`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\n**GET** `/replies?since=TIMESTAMP_30_DAYS_AGO&per_page=100`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nFile v1.0.7:references/contacts.md\n\n# Contacts & Leads\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/lists/:id/leads` | GET | Get leads in a list (paginated) |\n| `/contacts` | POST | Add up to 500 leads to a list |\n| `/contacts/remove` | POST | Remove a single lead by email from a list |\n| `/leads/:id` | PATCH | Update lead fields |\n| `/leads/:id/move` | PUT | Move a lead to a different list |\n| `/contacts/:id/archive` | PUT | Archive or unarchive a contact |\n\n## Get Leads\n\n**GET** `/lists/:id/leads?limit=100&skip=0`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params: `limit` (max 100), `skip`\n\n## Add Contacts\n\n**POST** `/contacts`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"list_id\": \"a1b2c3d4-e5f6-7890-abcd-abcdef123456\",\n  \"contacts\": [\n    {\n      \"Email\": \"john@example.com\",\n      \"First_Name\": \"John\",\n      \"Last_Name\": \"Doe\",\n      \"Phone\": \"+1234567890\",\n      \"Company\": \"Acme Inc\",\n      \"Title\": \"VP Sales\",\n      \"Custom_Field\": \"any value\"\n    }\n  ],\n  \"remove_duplicates\": true\n}\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | List UUID to add leads to |\n| `contacts` | object[] | ✅ | Array of lead objects (**max 500 per request**) |\n| `remove_duplicates` | boolean | | Remove duplicate emails after insert |\n\nEach contact object:\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `Email` | string | ✅ | Lead's email address |\n| `First_Name` | string | | First name |\n| `Last_Name` | string | | Last name |\n| `Phone` | string | | Phone number |\n| `Company` | string | | Company name |\n| `Title` | string | | Job title |\n| _(any key)_ | string | | Custom fields are supported |\n\n> **Field naming**: Use **PascalCase with underscores** (`First_Name`, `Last_Name`, `Email`).\n\n## Remove Contact\n\n**POST** `/contacts/remove`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"list_id\": \"a1b2c3d4-e5f6-7890-abcd-abcdef123456\",\n  \"email\": \"john@example.com\"\n}\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | List UUID |\n| `email` | string | ✅ | Email address of the lead to remove |\n\n## Update Lead\n\n**PATCH** `/leads/:id` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"First_Name\": \"Updated\",\n  \"Last_Name\": \"Name\",\n  \"Title\": \"CTO\"\n}\n```\n\nAny standard or custom contact fields can be updated. System fields (`_id`, `id`, `list_id`, `account_id`, `user_id`, `accuracy`, `provider`, `custom_fields`, `removed_sequences`, `verification_required`, `archive_invalid_contacts`, `archive_risky_contacts`, `processing`, `completed`, `completedAt`, `last_modified`, `created_date`, `verification_blocked`, `didOpen`, `didClick`, `didReply`, `contactStats`, `retryCount`, `esg_name`, `archived`, `deleted`) **cannot** be modified.\n\nIf updating `Email`, it is automatically lowercased.\n\n## Move Lead\n\n**PUT** `/leads/:id/move` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"list_id\": \"destination_list_uuid\" }\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | Destination list UUID |\n\n## Archive Contact\n\n**PUT** `/contacts/:id/archive`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"archived\": true }\n```\n\n> ⚠️ **The `:id` here is a MongoDB ObjectId** (24-char hex), NOT a UUID. This is the only contact endpoint that uses ObjectId.\n\nFile v1.0.7:references/folders.md\n\n# Folders\n\n## Endpoints\n\n| Endpoint   | Method | Description     |\n| ---------- | ------ | --------------- |\n| `/folders` | GET    | List folders    |\n| `/folders` | POST   | Create a folder |\n\n## Get Folders\n\n**GET** `/folders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\n## Create Folder\n\n**POST** `/folders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"name\": \"Q1 Campaigns\",\n  \"type\": \"sequence\"\n}\n```\n\n| Field  | Type   | Req | Description                                               |\n| ------ | ------ | --- | --------------------------------------------------------- |\n| `name` | string | ✅  | Folder name                                               |\n| `type` | string | ✅  | `\"list\"`, `\"template\"`, `\"sequence\"`, or `\"email-sender\"` |\n\n> If `type` contains `\"sender\"`, it is automatically converted to `\"email-sender\"`.\n\nFile v1.0.7:references/inbox-placement.md\n\n# Inbox Placement Tests\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/inbox-placement` | GET | List deliverability tests |\n| `/inbox-placement` | POST | Create a new deliverability test |\n| `/inbox-placement/:id/pause` | PUT | Pause an active **recurring** test |\n| `/inbox-placement/:id` | DELETE | Delete a test |\n\n## Get Tests\n\n**GET** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params:\n\n| Param | Type | Description |\n|-------|------|-------------|\n| `search` | string | Filter by test name (case-insensitive) |\n| `status` | string | Filter by status: `pending`, `running`, `completed`, `stopped` |\n| `mode` | string | Filter by mode: `one-time`, `recurring` |\n| `ownedBy` | string | Filter by user ID |\n| `limit` | integer | Page size (default: 10) |\n| `skip` | integer | Offset (default: 0) |\n| `sortBy` | string | Sort field (default: `created_at`) |\n| `sortType` | integer | `-1` for descending, `1` for ascending |\n\n> Note: filtering by `status=completed` excludes recurring tests since they never truly complete.\n\n## Create Test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | Test name (min 3 characters) |\n| `mode` | string | ✅ | `\"one-time\"` or `\"recurring\"` |\n| `source` | string | ✅ | `\"from-salesblink\"` or `\"from-outside\"` |\n| `sender_id` | string | ✅* | Sender UUID (required when `source=\"from-salesblink\"` or `mode=\"recurring\"`) |\n| `content_type` | string | ✅* | `\"custom\"`, `\"sequence\"`, or `\"template\"` (required when `source=\"from-salesblink\"` or `mode=\"recurring\"`) |\n| `subject` | string | ✅* | Email subject (required when `content_type=\"custom\"`) |\n| `body` | string | ✅* | Email HTML body (required when `content_type=\"custom\"`) |\n| `sequence_id` | string | ✅* | Sequence UUID (required when `content_type=\"sequence\"`) |\n| `template_id` | string | ✅* | Template ObjectId (required when `content_type=\"sequence\"` or `\"template\"`) |\n| `schedule_day` | integer | ✅* | Day of week: `0`=Sunday through `6`=Saturday (required when `mode=\"recurring\"`) |\n| `tracking_uuid` | string | | Optional UUID for `from-outside` tests. Auto-generated if omitted. |\n\n> *Field requirement depends on `source`, `mode`, and `content_type` values.\n\n**Behavior:**\n- **One-time tests** run ~2 minutes after creation by default.\n- **Recurring tests** run weekly on the specified `schedule_day` at 09:00 UTC.\n- **`from-outside` tests** return `seed_emails` in the response — these are the addresses the user must send to.\n- **`from-salesblink` tests** send automatically using the selected sender.\n\n**V1 Wrapper behavior:** When `source=\"from-salesblink\"` is provided without `content_type`:\n- If `subject` and `body` are present → `content_type` becomes `\"custom\"`\n- Otherwise → `content_type` becomes `\"sequence\"` with `sequence_id: \"from_api\"`\n\n### Example: One-time custom content test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Gmail Deliverability Check\",\n  \"mode\": \"one-time\",\n  \"source\": \"from-salesblink\",\n  \"sender_id\": \"sender-uuid-here\",\n  \"content_type\": \"custom\",\n  \"subject\": \"Hello from SalesBlink\",\n  \"body\": \"<p>This is a test email.</p>\"\n}\n```\n\n### Example: Recurring sequence-based test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Weekly Sequence Check\",\n  \"mode\": \"recurring\",\n  \"source\": \"from-salesblink\",\n  \"sender_id\": \"sender-uuid-here\",\n  \"content_type\": \"sequence\",\n  \"sequence_id\": \"sequence-uuid-here\",\n  \"template_id\": \"507f1f77bcf86cd799439011\",\n  \"schedule_day\": 1\n}\n```\n\n### Example: From-outside test (returns seed emails)\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"External Send Test\",\n  \"mode\": \"one-time\",\n  \"source\": \"from-outside\"\n}\n```\n\nResponse for `from-outside`:\n```json\n{\n  \"success\": true,\n  \"data\": { \"id\": \"...\", \"tracking_uuid\": \"...\", ... },\n  \"seed_emails\": [\"seed1@test.com\", \"seed2@test.com\", ...]\n}\n```\n\n## Pause Test\n\n**PUT** `/inbox-placement/:id/pause`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nOnly works on **recurring** tests. Sets status to `stopped` and clears scheduling.\n\n## Delete Test\n\n**DELETE** `/inbox-placement/:id`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nDeletes the test and all associated tracking tasks.\n\nFile v1.0.7:references/inbox.md\n\n# Inbox & Outreach\n\n## Endpoints\n\n| Endpoint                   | Method | Description                                     |\n| -------------------------- | ------ | ----------------------------------------------- |\n| `/inbox`                   | GET    | Retrieve inbox threads                          |\n| `/inbox/:messageId/thread` | GET    | Get all messages in a specific thread           |\n| `/inbox/:messageId/reply`  | POST   | Reply to a lead's email                         |\n| `/inbox/:messageId`        | PATCH  | Mark as read/unread, set outcome classification |\n\n## Get Inbox\n\n**GET** `/inbox`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params:\n\n| Param      | Type    | Description                                               |\n| ---------- | ------- | --------------------------------------------------------- |\n| `type`     | string  | `all` (replies, default), `draft`, `scheduled`, or `sent` |\n| `limit`    | integer | Max 100 (default: 10)                                     |\n| `skip`     | integer | Offset (default: 0)                                       |\n| `sequence` | string  | Filter by sequence UUID                                   |\n| `outcome`  | string  | Filter by outcome classification                          |\n| `search`   | string  | Search in body, subject, or email address                 |\n| `date`     | string  | Date range as `startTimestamp-endTimestamp`               |\n| `sender`   | string  | Filter by sender ID                                       |\n| `owned_by` | string  | Filter by user email (owners/admins only)                 |\n\n```\nGET /inbox?type=all&limit=50&skip=0\nGET /inbox?type=sent&sequence=SEQ_ID&limit=100\nGET /inbox?search=acme&limit=20\n```\n\nResponse includes `data.result` (thread array), `totalCount`, `count`, and `messageIDs`.\n\n## Get Thread\n\n**GET** `/inbox/:messageId/thread`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\nReturns all messages in a conversation thread, sorted newest first.\n\n## Reply to Email\n\n**POST** `/inbox/:messageId/reply`\n\n**Requires explicit user confirmation before sending.** This sends a real reply to a real recipient.\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"content\": \"<p>Thanks for getting back to me! Let's schedule a call.</p>\",\n  \"cc\": \"manager@company.com\"\n}\n```\n\n| Field              | Type    | Req | Description                                             |\n| ------------------ | ------- | --- | ------------------------------------------------------- |\n| `content`          | string  | ✅  | HTML content of the reply                               |\n| `cc`               | string  |     | Optional CC email address                               |\n| `bcc`              | string  |     | Optional BCC email address                              |\n| `scheduled_time`   | integer |     | Schedule at this timestamp (ms). Defaults to ~20s delay |\n| `tzMode`           | string  |     | Timezone mode: `\"sequence\"` or `\"custom\"`               |\n| `selectedTimezone` | string  |     | Timezone identifier if tzMode is custom                 |\n\n> Attachments are supported via FormData field `attachment`. Base64 images in HTML are automatically uploaded to S3.\n> The reply is automatically sent from the same sender that originally contacted the lead.\n\n## Update Mail State\n\n**PATCH** `/inbox/:messageId`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"unread\": false,\n  \"outcome\": \"interested\"\n}\n```\n\n| Field     | Type    | Description                                                                                                                                                              |\n| --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `unread`  | boolean | Mark as read (`false`) or unread (`true`)                                                                                                                                |\n| `outcome` | string  | Classify the reply: `\"interested\"`, `\"not-interested\"`, `\"automatic-response\"`, `\"meeting-request\"`, `\"out-of-office\"`, `\"do-not-contact\"`, `\"wrong-person\"`, `\"closed\"` |\n\nFile v1.0.7:references/lists.md\n\n# Lists\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/lists` | GET | Retrieve all lists. Query: `limit` (max 100), `skip`, `owned_by` |\n| `/lists/:id` | GET | Get a specific list by UUID |\n| `/lists/:id/leads` | GET | Get leads in a list. Query: `limit` (max 100), `skip` |\n| `/lists` | POST | Create a new list |\n| `/lists/:id` | PATCH | Update a list |\n| `/lists/:id/archive` | PUT | Archive or unarchive a list |\n\n## Create List\n\n**POST** `/lists`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Q1 Prospects\",\n  \"removeDuplicates\": {\n    \"inThisList\": true,\n    \"inOtherLists\": true\n  }\n}\n```\n\nRequired fields marked with ✅:\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | List name |\n| `folder` | string | | Folder ID (UUID) |\n| `starred` | boolean | | Star the list (default: false) |\n| `verification` | boolean | | Enable email verification ⚠️ **IRREVERSIBLE** |\n| `archive_invalid` | boolean | | Auto-archive invalid emails ⚠️ **IRREVERSIBLE** |\n| `archive_risky` | boolean | | Auto-archive risky emails ⚠️ **IRREVERSIBLE** |\n| `removeDuplicates.inThisList` | boolean | | Remove duplicate emails within this list |\n| `removeDuplicates.inOtherLists` | boolean | | Remove contacts that exist in other lists |\n| `removeDuplicates.inTeamMembersLists` | boolean | | Remove contacts that exist in team members' lists |\n\n## Update List\n\n**PATCH** `/lists/:id` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Q2 Prospects Restructured\",\n  \"starred\": true,\n  \"archive_invalid\": true\n}\n```\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `name` | string | New name |\n| `starred` | boolean | Star or unstar |\n| `duplicate_removal` | boolean | Remove duplicates from this list |\n| `duplicate_removal_other_list` | boolean | Remove contacts in other lists |\n| `duplicate_removal_team_list` | boolean | Remove contacts in team members' lists |\n| `verification` | boolean | Enable verification ⚠️ **IRREVERSIBLE** |\n| `archive_invalid` | boolean | Archive invalid emails ⚠️ **IRREVERSIBLE** |\n| `archive_risky` | boolean | Archive risky emails ⚠️ **IRREVERSIBLE** |\n\n> Use `PUT /lists/:id/archive` for archiving — not this endpoint.\n\n## Archive List\n\n**PUT** `/lists/:id/archive`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"archived\": true }\n```\n\nSet `\"archived\": false` to unarchive.\n\nFile v1.0.7:references/organization.md\n\n# Organization — Users & Workspaces\n\n> **High-privilege warning:** These endpoints manage workspace membership and roles. Inviting users or changing roles (especially to `admin`) are high-impact account actions. **You must obtain explicit user confirmation before inviting a user or changing any role.** Use a least-privilege SalesBlink API key where possible; avoid owner/admin keys unless required.\n\n## Users\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/users` | GET | List workspace users |\n| `/users` | POST | Invite a user |\n| `/users/:id` | PATCH | Update user name or role |\n\n> **Explicit approval required** for POST and PATCH on `/users`.\n\n### Create User\n\n**POST** `/users`\n\n**Requires explicit user confirmation before invoking.**\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"email\": \"newmember@company.com\",\n  \"role\": \"user\",\n  \"url\": \"https://run.salesblink.io/dashboard\"\n}\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `email` | string | ✅ | Email address of the new user |\n| `role` | string | | `\"client\"`, `\"user\"`, `\"admin\"`, or `\"developer\"`. Default: `\"user\"` |\n| `url` | string | | Optional redirect URL after accepting invitation |\n\n> Only **owners and admins** can add users. Returns 403 otherwise.\n> **Confirm with the user before sending this request.**\n\n### Update User\n\n**PATCH** `/users/:id` (UUID)\n\n**Requires explicit user confirmation before invoking, especially for role changes.**\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Updated Name\",\n  \"role\": \"admin\"\n}\n```\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `name` | string | New display name |\n| `role` | string | One of: `client`, `user`, `admin`, `developer` |\n\n> **Confirm with the user before changing roles.** Elevating a user to `admin` grants high-privilege workspace access.\n\n---\n\n## Workspaces\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/workspaces` | GET | List all accessible workspaces |\n| `/workspaces` | POST | Create a new workspace |\n| `/workspaces/:id` | PATCH | Update workspace name |\n\n> **Owner only.** Returns 403 for non-owners.\n\n### Create Workspace\n\n**POST** `/workspaces`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"name\": \"Sales Team\" }\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | Workspace name (min 4 characters) |\n\n### Update Workspace\n\n**PATCH** `/workspaces/:id` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"name\": \"New Workspace Name\" }\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | New workspace name (min 4 characters) |\n\nFile v1.0.7:references/reports.md\n\n# Reports\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/reports` | GET | Retrieve activity reports with aggregated data |\n\n## Get Reports\n\n**GET** `/reports`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params:\n\n| Param | Type | Description |\n|-------|------|-------------|\n| `from` | integer | Start date timestamp (milliseconds) |\n| `to` | integer | End date timestamp (milliseconds) |\n| `limit` | integer | Max 100 (default enforced server-side) |\n| `skip` | integer | Offset |\n\n> The endpoint maps `from`/`to` to a date range filter internally. Both are optional; omitting them returns all available report data.\n\n**GET** `/reports?from=1715000000000&to=1717600000000`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nFile v1.0.7:references/senders.md\n\n# Email Senders & OAuth\n\n> **Credential safety:** Connecting senders involves sensitive mail credentials or OAuth authorization for Gmail/Outlook accounts. **Prefer OAuth over SMTP passwords.** If SMTP is required, use app-specific passwords. Do not paste or store unnecessary mailbox credentials. Always confirm exactly which sender account is being connected before submitting.\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/senders` | GET | List all connected senders (grouped by folder) |\n| `/senders` | POST | Add a single SMTP/IMAP sender |\n| `/senders/bulk` | POST | Bulk add senders via CSV upload |\n| `/oauth/google` | POST | Get Google OAuth URL for connecting Gmail |\n| `/oauth/outlook` | POST | Get Microsoft OAuth URL for connecting Outlook |\n\n## Get Senders\n\n**GET** `/senders`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params: `limit` (max 100), `skip`, `owned_by`\n\n## Add Single Sender (SMTP/IMAP)\n\n**POST** `/senders`\n\n**Confirm the exact sender account with the user before submitting.** Prefer OAuth when available. If SMTP is required, use an app-specific password rather than the primary account password.\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"from_email\": \"outreach@yourcompany.com\",\n  \"from_name\": \"Sales Team\",\n  \"password\": \"your_app_specific_password\",\n  \"smtp_host\": \"smtp.yourprovider.com\",\n  \"smtp_port\": 587,\n  \"user_name\": \"outreach@yourcompany.com\",\n  \"imap_host\": \"imap.yourprovider.com\",\n  \"imap_port\": 993\n}\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `from_email` | string | ✅ | Sender email address |\n| `password` | string | ✅ | SMTP/IMAP password |\n| `smtp_host` | string | ✅ | SMTP server hostname |\n| `smtp_port` | integer/string | ✅ | SMTP port (e.g., 587) |\n| `from_name` | string | | Display name |\n| `user_name` | string | | SMTP username (defaults to `from_email`) |\n| `imap_host` | string | | IMAP hostname (omit for SMTP-only) |\n| `imap_port` | integer/string | | IMAP port (e.g., 993) |\n| `imap_user_name` | string | | IMAP username if different from SMTP |\n| `imap_password` | string | | IMAP password if different from SMTP |\n| `total_warmup_per_day` | integer | | Warmup emails per day (default: 5) |\n| `warmup_enabled` | boolean | | Enable warmup (default: false) |\n| `inbox_enable` | boolean | | Enable inbox (default: false) |\n| `warmup_tag` | string | | Warmup keyword/tag |\n| `inbox_path` | string | | Inbox folder path (default: \"INBOX\") |\n| `spam_path` | string | | Spam folder path |\n| `signature_id` | string | | Signature ID or name to attach |\n| `custom_tracking_url` | string | | Custom tracking domain (must be verified) |\n| `sequence_auto_ramp_up_enabled` | boolean | | Enable sequence ramp-up |\n| `sequence_initial_daily_frequency` | integer | | Initial daily send limit (default: 30) |\n| `sequence_ramp_up_frequency` | integer | | Ramp-up increment (default: 3) |\n| `max_emails_per_day` | integer | | Max daily send limit (default: 30) |\n| `dkim_identifier` | string | | DKIM identifier |\n| `reply_to_email` | string | | Reply-to email address |\n\n> If `imap_host` is omitted or empty, the sender is created as **SMTP-only** (`serviceName: \"smtponly\"`).\n\n## Bulk Add Senders\n\n**POST** `/senders/bulk`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `multipart/form-data`\n\nUpload a CSV file via FormData with field name `csvFile`.\n\n## Google OAuth\n\n**POST** `/oauth/google`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nReturns an `auth_url` that the user must visit to authorize Gmail access.\n\nResponse:\n```json\n{\n  \"success\": true,\n  \"data\": { \"auth_url\": \"https://accounts.google.com/o/oauth2/v2/auth?...\" }\n}\n```\n\n## Outlook OAuth\n\n**POST** `/oauth/outlook`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nReturns an `auth_url` for Microsoft Outlook authorization.\n\nArchive v1.0.6: 15 files, 19179 bytes\n\nFiles: references/account-config.md (558b), references/activity.md (1350b), references/contacts.md (3692b), references/folders.md (910b), references/inbox-placement.md (4673b), references/inbox.md (4245b), references/lists.md (2623b), references/organization.md (2191b), references/reports.md (780b), references/senders.md (3374b), references/sequences.md (6308b), references/templates.md (2615b), references/workflows.md (3584b), SKILL.md (9428b), _meta.json (140b)\n\nFile v1.0.6:SKILL.md\n\n---\nname: cold-email-salesblink\ndescription: >\n  Run cold email sequences on autopilot and manage full sales outreach campaigns via the SalesBlink API.\n  Use this skill to build automated multi-step email campaigns (sequences), manage leads and email lists,\n  create reusable templates with merge variables and spintax, connect sending accounts (Gmail, Outlook, SMTP),\n  handle inbox replies, and track campaign analytics (opens, clicks, replies, sent).\n  Also supports bulk contact imports, email deliverability testing (inbox placement / spam checks),\n  sender warmup links, workspace/team management, and any HTTP request to the SalesBlink platform.\ncompatibility: >\n  Requires network access to run.salesblink.io and a SALESBLINK_API_KEY.\n  Supports any HTTP client (curl, Node.js fetch, Python requests, PowerShell, etc.).\n  No prior knowledge of SalesBlink is needed: the skill guides you through connecting email accounts,\n  importing leads, writing templates, building sequences, launching campaigns, and monitoring deliverability.\nmetadata:\n  openclaw:\n    requires:\n      env:\n        - SALESBLINK_API_KEY\n    primaryEnv: SALESBLINK_API_KEY\n---\n\n# SalesBlink Public REST API v1.0.0\n\n## When to use this skill\n\nUse this skill when the user wants to:\n\n- Create, update, or manage email lists, sequences, templates, or senders\n- Add, update, move, or remove contacts/leads\n- Send or reply to emails via the inbox\n- Check campaign analytics (opens, clicks, replies, sent)\n- Set up outreach campaigns end-to-end\n- Manage workspaces, users, folders, or deliverability tests\n- Make any HTTP request to `run.salesblink.io/api/public/v1.0.0`\n\n## Gotchas\n\n- **ID types matter**: Templates and contact archive use MongoDB ObjectId (24-char hex). All other entities use UUID v4.\n- **messageId** is the RFC822 Message-ID (e.g. `<id@domain.com>`) or Microsoft Graph ID. **Crucial:** Always URL-encode this ID when using it as a path parameter (e.g. in `/inbox/:messageId/thread`). This is distinct from the internal UUID `id`.\n- **`senders` is a comma-separated string**, not an array. It can mix sender IDs and folder IDs — the server auto-detects each.\n- **Sequence `steps` fully replace on PATCH**. Send the complete desired array.\n- **Verification flags are IRREVERSIBLE**: `verification`, `archive_invalid`, `archive_risky` on lists can only be turned ON, never OFF.\n- **Sequences default to paused**: If `paused` is omitted on create, it defaults to `true`.\n- **`launchTimingMode: \"now\"` starts in 5 minutes**, not instantly.\n- **Template attachments use FormData field `attachment`** (not `attachments`). Max 3 per template.\n- **Remove template attachments via `remove_attachments`** array of file **names**.\n- **Adding SMTP sender requires `from_email`**, not `email`.\n- **If an endpoint for a specific task is not mentioned then tell the user that the endpoint is not available**\n- **If user does not have a list, ask them for a CSV file, or list of lead emails with data.**\n- **If email sender is not connected, help them connect one using APIs.**\n- **When asked to create a sequence or campaign for cold email outreach, first ask them about their ICP, Offer, and other details.**\n\n## Base URL\n\n`https://run.salesblink.io/api/public/v1.0.0`\n\n## Authentication\n\nAsk the user for their SALESBLINK_API_KEY: `https://run.salesblink.io/account/integration/api`\n\nPass it in every request as the `Authorization` header (no \"Bearer\" prefix):\n\n**Header:** `Authorization: key-****`\n\n## Rate Limits\n\n| Method        | Limit | Window     |\n| ------------- | ----- | ---------- |\n| GET           | 30    | per minute |\n| POST / PATCH  | 15    | per minute |\n| PUT (archive) | 10    | per minute |\n\nOn `429 Too Many Requests`: wait at least 60 seconds before retrying. For batch operations, insert a 4-second delay between requests.\n\n## Pagination\n\nMost list endpoints use `limit` (max 100) and `skip`. Activity endpoints (`/sent`, `/opens`, `/clicks`, `/replies`) use `per_page` (max 100) and `page` (1-indexed).\n\nAlways paginate. Never assume a single request returns all data.\n\n## Endpoint Categories\n\nRead the relevant reference file before performing operations in that domain:\n\n- **Lists & contacts/leads** → [references/lists.md](references/lists.md) and [references/contacts.md](references/contacts.md)\n  - Use these endpoints when the user wants to fetch or manage lists that contain leads/contacts. A list is a container for contacts/leads. Each contact/lead contains fields like Email, First_Name, Last_Name, Phone, Company, Title, and custom fields. Contacts are added to lists in batches (up to 500 per request), can be moved between lists, updated, or removed.\n\n- **Email templates** → [references/templates.md](references/templates.md)\n  - Use these endpoints when the user wants to create or manage reusable email templates. A template has a name, subject_line, and HTML content that supports merge variables like {{first_name}} and {{company}}. Templates can have up to 3 attachments and are referenced by sequences when building outreach steps.\n\n- **Sequences & email campaigns** → [references/sequences.md](references/sequences.md)\n  - Use these endpoints when the user wants to create or manage automated email campaigns (sequences). A sequence connects lists (who to email), senders (which accounts send), and templates (what to send) into a timed step-by-step workflow. Steps alternate between email sends and delay periods. Sequences can be launched, paused, resumed, cloned, or archived.\n\n- **Senders & OAuth** → [references/senders.md](references/senders.md)\n  - Use these endpoints when the user wants to connect or manage email sending accounts. A sender is an email account (SMTP/IMAP or OAuth-connected Gmail/Outlook) that sends emails on behalf of sequences. Multiple senders can be assigned to a sequence. Senders can also be organized into folders.\n\n- **Inbox & replies** → [references/inbox.md](references/inbox.md)\n  - Use these endpoints when the user wants to view or interact with email conversations. The inbox contains reply threads, sent emails, scheduled emails, and drafts. Each thread has a messageId. The user can reply to a lead's email, mark messages as read/unread, or classify outcomes.\n\n- **Activity tracking** → [references/activity.md](references/activity.md)\n  - Use these endpoints when the user wants to query engagement events. The system tracks four event types: sent (emails sent), opens (emails opened), clicks (links clicked), and replies (responses received). Events can be filtered by sequence, recipient email, and date range.\n\n- **Users & workspaces** → [references/organization.md](references/organization.md)\n  - Use these endpoints when the user wants to manage team membership or workspaces. A workspace is an account boundary. Users have roles (client, user, admin, developer). Only owners and admins can invite users or create workspaces.\n\n- **Folders** → [references/folders.md](references/folders.md)\n  - Use these endpoints when the user wants to organize resources into folders. Folders have a type (list, template, sequence, or email-sender) and group related resources together for easier management.\n\n- **Domains, signatures & warmup links** → [references/account-config.md](references/account-config.md)\n  - Use these endpoints when the user wants to view account-level configuration. Custom tracking domains are used for click tracking in emails. Signatures are appended to outgoing emails. Warmup links are used in email warmup processes.\n\n- **Reports** → [references/reports.md](references/reports.md)\n  - Use these endpoints when the user wants to fetch aggregated activity reports over a date range. Reports combine data across campaigns into summary views.\n\n- **Inbox placement tests** → [references/inbox-placement.md](references/inbox-placement.md)\n  - Use these endpoints when the user wants to test email deliverability. An inbox placement test sends a test email to seed email addresses across providers (Gmail, Outlook, etc.) and reports whether the email landed in inbox, spam, promotions, or other tabs. Tests can be one-time or recurring.\n\n- **End-to-end workflow examples** → [references/workflows.md](references/workflows.md)\n  - Use this reference when the user wants to set up a complete outreach campaign from scratch. It shows the full chain: create list → add contacts → create templates → fetch senders → create sequence → launch.\n\n## Error Handling\n\nAlways check the `success` boolean in the response body. A `200` status can still return `{ success: false, message: \"...\" }`.\n\n| Status | Meaning      | Action                                                |\n| ------ | ------------ | ----------------------------------------------------- |\n| 200    | Success      | Check `success` field                                 |\n| 400    | Bad request  | Re-check payload structure against the reference file |\n| 401    | Unauthorized | Verify API key                                        |\n| 403    | Forbidden    | Insufficient permissions (role too low)               |\n| 404    | Not found    | Verify the ID / endpoint                              |\n| 409    | Conflict     | Resource already exists or connection failed          |\n| 429    | Rate limited | Wait 60s, then retry                                  |\n| 500    | Server error | Retry once after 10s                                  |\n\nFile v1.0.6:_meta.json\n\n{\n  \"ownerId\": \"kn7fnmjb3nqezc1gc8b74fmgrh84rx5t\",\n  \"slug\": \"cold-email-salesblink\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1777914591239\n}\n\nFile v1.0.6:references/account-config.md\n\n# Account Config — Domains, Signatures & Warmup Links\n\n## Domains\n\n**GET** `/domains`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList custom tracking domains for the account.\n\n## Signatures\n\n**GET** `/signatures`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList email signatures.\n\n> Signature IDs can be referenced when adding senders via the `signature_id` field. You can pass either the signature ID or its name.\n\n## Warmup Links\n\n**GET** `/warmup-links`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList warmup link configurations.\n\nFile v1.0.6:references/activity.md\n\n# Activity Tracking\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/sent` | GET | Log of all sent emails |\n| `/opens` | GET | Email open events |\n| `/clicks` | GET | Link click events |\n| `/replies` | GET | Reply events |\n\n## Query Parameters\n\nAll activity endpoints support:\n\n| Param | Type | Description |\n|-------|------|-------------|\n| `per_page` | integer | Max 100 |\n| `page` | integer | 1-indexed |\n| `sequence_id` | string | Filter by sequence UUID |\n| `recipient_email_address` | string | Filter by email address |\n| `since` | integer | Filter events after this timestamp (ms) |\n| `from` | integer | Start of date range (timestamp, ms) |\n| `to` | integer | End of date range (timestamp, ms) |\n\n> Use `per_page` and `page` for activity endpoints — not `limit`/`skip`.\n\n## Response Format\n\nEach event includes:\n```json\n{\n  \"id\": \"...\",\n  \"time\": 1715000000000,\n  \"message\": \"Sent\",\n  \"type\": \"outreach\",\n  \"sequence\": \"sequence-uuid\",\n  \"email\": \"lead@example.com\",\n  \"sequence_name\": \"Campaign Name\"\n}\n```\n\nFor clicks and replies, `template_name` is also included.\n\n## Examples\n\n**GET** `/opens?sequence_id=SEQ_ID&per_page=100&page=1`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\n**GET** `/replies?since=TIMESTAMP_30_DAYS_AGO&per_page=100`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nFile v1.0.6:references/contacts.md\n\n# Contacts & Leads\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/lists/:id/leads` | GET | Get leads in a list (paginated) |\n| `/contacts` | POST | Add up to 500 leads to a list |\n| `/contacts/remove` | POST | Remove a single lead by email from a list |\n| `/leads/:id` | PATCH | Update lead fields |\n| `/leads/:id/move` | PUT | Move a lead to a different list |\n| `/contacts/:id/archive` | PUT | Archive or unarchive a contact |\n\n## Get Leads\n\n**GET** `/lists/:id/leads?limit=100&skip=0`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params: `limit` (max 100), `skip`\n\n## Add Contacts\n\n**POST** `/contacts`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"list_id\": \"a1b2c3d4-e5f6-7890-abcd-abcdef123456\",\n  \"contacts\": [\n    {\n      \"Email\": \"john@example.com\",\n      \"First_Name\": \"John\",\n      \"Last_Name\": \"Doe\",\n      \"Phone\": \"+1234567890\",\n      \"Company\": \"Acme Inc\",\n      \"Title\": \"VP Sales\",\n      \"Custom_Field\": \"any value\"\n    }\n  ],\n  \"remove_duplicates\": true\n}\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | List UUID to add leads to |\n| `contacts` | object[] | ✅ | Array of lead objects (**max 500 per request**) |\n| `remove_duplicates` | boolean | | Remove duplicate emails after insert |\n\nEach contact object:\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `Email` | string | ✅ | Lead's email address |\n| `First_Name` | string | | First name |\n| `Last_Name` | string | | Last name |\n| `Phone` | string | | Phone number |\n| `Company` | string | | Company name |\n| `Title` | string | | Job title |\n| _(any key)_ | string | | Custom fields are supported |\n\n> **Field naming**: Use **PascalCase with underscores** (`First_Name`, `Last_Name`, `Email`).\n\n## Remove Contact\n\n**POST** `/contacts/remove`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"list_id\": \"a1b2c3d4-e5f6-7890-abcd-abcdef123456\",\n  \"email\": \"john@example.com\"\n}\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | List UUID |\n| `email` | string | ✅ | Email address of the lead to remove |\n\n## Update Lead\n\n**PATCH** `/leads/:id` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"First_Name\": \"Updated\",\n  \"Last_Name\": \"Name\",\n  \"Title\": \"CTO\"\n}\n```\n\nAny standard or custom contact fields can be updated. System fields (`_id`, `id`, `list_id`, `account_id`, `user_id`, `accuracy`, `provider`, `custom_fields`, `removed_sequences`, `verification_required`, `archive_invalid_contacts`, `archive_risky_contacts`, `processing`, `completed`, `completedAt`, `last_modified`, `created_date`, `verification_blocked`, `didOpen`, `didClick`, `didReply`, `contactStats`, `retryCount`, `esg_name`, `archived`, `deleted`) **cannot** be modified.\n\nIf updating `Email`, it is automatically lowercased.\n\n## Move Lead\n\n**PUT** `/leads/:id/move` (UUID)\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"list_id\": \"destination_list_uuid\" }\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `list_id` | string | ✅ | Destination list UUID |\n\n## Archive Contact\n\n**PUT** `/contacts/:id/archive`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"archived\": true }\n```\n\n> ⚠️ **The `:id` here is a MongoDB ObjectId** (24-char hex), NOT a UUID. This is the only contact endpoint that uses ObjectId.\n\nFile v1.0.6:references/folders.md\n\n# Folders\n\n## Endpoints\n\n| Endpoint   | Method | Description     |\n| ---------- | ------ | --------------- |\n| `/folders` | GET    | List folders    |\n| `/folders` | POST   | Create a folder |\n\n## Get Folders\n\n**GET** `/folders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n\n## Create Folder\n\n**POST** `/folders`\n\nHeaders:\n\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n\n```json\n{\n  \"name\": \"Q1 Campaigns\",\n  \"type\": \"sequence\"\n}\n```\n\n| Field  | Type   | Req | Description                                               |\n| ------ | ------ | --- | --------------------------------------------------------- |\n| `name` | string | ✅  | Folder name                                               |\n| `type` | string | ✅  | `\"list\"`, `\"template\"`, `\"sequence\"`, or `\"email-sender\"` |\n\n> If `type` contains `\"sender\"`, it is automatically converted to `\"email-sender\"`.\n\nFile v1.0.6:references/inbox-placement.md\n\n# Inbox Placement Tests\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/inbox-placement` | GET | List deliverability tests |\n| `/inbox-placement` | POST | Create a new deliverability test |\n| `/inbox-placement/:id/pause` | PUT | Pause an active **recurring** test |\n| `/inbox-placement/:id` | DELETE | Delete a test |\n\n## Get Tests\n\n**GET** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nQuery params:\n\n| Param | Type | Description |\n|-------|------|-------------|\n| `search` | string | Filter by test name (case-insensitive) |\n| `status` | string | Filter by status: `pending`, `running`, `completed`, `stopped` |\n| `mode` | string | Filter by mode: `one-time`, `recurring` |\n| `ownedBy` | string | Filter by user ID |\n| `limit` | integer | Page size (default: 10) |\n| `skip` | integer | Offset (default: 0) |\n| `sortBy` | string | Sort field (default: `created_at`) |\n| `sortType` | integer | `-1` for descending, `1` for ascending |\n\n> Note: filtering by `status=completed` excludes recurring tests since they never truly complete.\n\n## Create Test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | Test name (min 3 characters) |\n| `mode` | string | ✅ | `\"one-time\"` or `\"recurring\"` |\n| `source` | string | ✅ | `\"from-salesblink\"` or `\"from-outside\"` |\n| `sender_id` | string | ✅* | Sender UUID (required when `source=\"from-salesblink\"` or `mode=\"recurring\"`) |\n| `content_type` | string | ✅* | `\"custom\"`, `\"sequence\"`, or `\"template\"` (required when `source=\"from-salesblink\"` or `mode=\"recurring\"`) |\n| `subject` | string | ✅* | Email subject (required when `content_type=\"custom\"`) |\n| `body` | string | ✅* | Email HTML body (required when `content_type=\"custom\"`) |\n| `sequence_id` | string | ✅* | Sequence UUID (required when `content_type=\"sequence\"`) |\n| `template_id` | string | ✅* | Template ObjectId (required when `content_type=\"sequence\"` or `\"template\"`) |\n| `schedule_day` | integer | ✅* | Day of week: `0`=Sunday through `6`=Saturday (required when `mode=\"recurring\"`) |\n| `tracking_uuid` | string | | Optional UUID for `from-outside` tests. Auto-generated if omitted. |\n\n> *Field requirement depends on `source`, `mode`, and `content_type` values.\n\n**Behavior:**\n- **One-time tests** run ~2 minutes after creation by default.\n- **Recurring tests** run weekly on the specified `schedule_day` at 09:00 UTC.\n- **`from-outside` tests** return `seed_emails` in the response — these are the addresses the user must send to.\n- **`from-salesblink` tests** send automatically using the selected sender.\n\n**V1 Wrapper behavior:** When `source=\"from-salesblink\"` is provided without `content_type`:\n- If `subject` and `body` are present → `content_type` becomes `\"custom\"`\n- Otherwise → `content_type` becomes `\"sequence\"` with `sequence_id: \"from_api\"`\n\n### Example: One-time custom content test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Gmail Deliverability Check\",\n  \"mode\": \"one-time\",\n  \"source\": \"from-salesblink\",\n  \"sender_id\": \"sender-uuid-here\",\n  \"content_type\": \"custom\",\n  \"subject\": \"Hello from SalesBlink\",\n  \"body\": \"<p>This is a test email.</p>\"\n}\n```\n\n### Example: Recurring sequence-based test\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"Weekly Sequence Check\",\n  \"mode\": \"recurring\",\n  \"source\": \"from-salesblink\",\n  \"sender_id\": \"sender-uuid-here\",\n  \"content_type\": \"sequence\",\n  \"sequence_id\": \"sequence-uuid-here\",\n  \"template_id\": \"507f1f77bcf86cd799439011\",\n  \"schedule_day\": 1\n}\n```\n\n### Example: From-outside test (returns seed emails)\n\n**POST** `/inbox-placement`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{\n  \"name\": \"External Send Test\",\n  \"mode\": \"one-time\",\n  \"source\": \"from-outside\"\n}\n```\n\nResponse for `from-outside`:\n```json\n{\n  \"success\": true,\n  \"data\": { \"id\": \"...\", \"tracking_uuid\": \"...\", ... },\n  \"seed_emails\": [\"seed1@test.com\", \"seed2@test.com\", ...]\n}\n```\n\n## Pause\n\nArchive v1.0.5: 15 files, 19179 bytes\n\nFiles: references/account-config.md (558b), references/activity.md (1350b), references/contacts.md (3692b), references/folders.md (910b), references/inbox-placement.md (4673b), references/inbox.md (4245b), references/lists.md (2623b), references/organization.md (2191b), references/reports.md (780b), references/senders.md (3374b), references/sequences.md (6308b), references/templates.md (2615b), references/workflows.md (3584b), SKILL.md (9428b), _meta.json (140b)\n\nArchive v1.0.4: 15 files, 19179 bytes\n\nFiles: references/account-config.md (558b), references/activity.md (1350b), references/contacts.md (3692b), references/folders.md (910b), references/inbox-placement.md (4673b), references/inbox.md (4245b), references/lists.md (2623b), references/organization.md (2191b), references/reports.md (780b), references/senders.md (3374b), references/sequences.md (6308b), references/templates.md (2615b), references/workflows.md (3584b), SKILL.md (9428b), _meta.json (140b)\n\nArchive v1.0.3: 15 files, 19178 bytes\n\nFiles: references/account-config.md (558b), references/activity.md (1350b), references/contacts.md (3692b), references/folders.md (910b), references/inbox-placement.md (4673b), references/inbox.md (4245b), references/lists.md (2623b), references/organization.md (2191b), references/reports.md (780b), references/senders.md (3374b), references/sequences.md (6308b), references/templates.md (2615b), references/workflows.md (3584b), SKILL.md (9430b), _meta.json (140b)\n\nArchive v1.0.2: 15 files, 19175 bytes\n\nFiles: references/account-config.md (558b), references/activity.md (1350b), references/contacts.md (3692b), references/folders.md (910b), references/inbox-placement.md (4673b), references/inbox.md (4245b), references/lists.md (2623b), references/organization.md (2191b), references/reports.md (780b), references/senders.md (3374b), references/sequences.md (6308b), references/templates.md (2615b), references/workflows.md (3584b), SKILL.md (9440b), _meta.json (140b)\n\nArchive v1.0.1: 15 files, 19193 bytes\n\nFiles: references/account-config.md (558b), references/activity.md (1350b), references/contacts.md (3692b), references/folders.md (910b), references/inbox-placement.md (4673b), references/inbox.md (4245b), references/lists.md (2623b), references/organization.md (2191b), references/reports.md (780b), references/senders.md (3374b), references/sequences.md (6308b), references/templates.md (2615b), references/workflows.md (3584b), SKILL.md (9488b), _meta.json (140b)\n\nArchive v1.0.0: 15 files, 18869 bytes\n\nFiles: references/account-config.md (540b), references/activity.md (1338b), references/contacts.md (3656b), references/folders.md (898b), references/inbox-placement.md (4631b), references/inbox.md (4221b), references/lists.md (2605b), references/organization.md (2167b), references/reports.md (768b), references/senders.md (3344b), references/sequences.md (6284b), references/templates.md (2597b), references/workflows.md (3518b), SKILL.md (8852b), _meta.json (140b)","readmeExcerpt":"Skill: Cold Email Campaigns with SalesBlink Owner: sheksushant Summary: Run cold email sequences on autopilot and manage full sales outreach campaigns via the SalesBlink API. Use this skill to build automated multi-step email cam... Tags: latest:1.0.9 Version history: v1.0.9 | 2026-05-13T16:44:06.712Z | user Version 1.0.9 - Added detailed safety and compliance guardrails for campaign launches, billing, API/key manage","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\n  \"email\": \"user@example.com\",\n  \"password\": \"SecurePassword123\",\n  \"name\": \"John Doe\"\n}"},{"language":"json","snippet":"{\n  \"success\": true,\n  \"data\": {\n    \"account_id\": \"...\",\n    \"user_id\": \"...\",\n    \"api_key\": \"key-...\"\n  }\n}"},{"language":"json","snippet":"{\n  \"id\": \"...\",\n  \"time\": 1715000000000,\n  \"message\": \"Sent\",\n  \"type\": \"outreach\",\n  \"sequence\": \"sequence-uuid\",\n  \"email\": \"lead@example.com\",\n  \"sequence_name\": \"Campaign Name\"\n}"},{"language":"json","snippet":"{ \"name\": \"Zapier Integration\" }"},{"language":"json","snippet":"{\n  \"success\": true,\n  \"message\": \"Add card login link generated successfully\",\n  \"data\": {\n    \"login_link\": \"https://run.salesblink.io/magic?token=...&redirect=%2Faccount%2Fbilling%3Ftab%3Dcard\",\n    \"destination\": \"/account/billing?tab=card\",\n    \"purpose\": \"add_card\"\n  }\n}"},{"language":"json","snippet":"{\n  \"success\": true,\n  \"message\": \"Remove card login link generated successfully\",\n  \"data\": {\n    \"login_link\": \"https://run.salesblink.io/magic?token=...&redirect=%2Faccount%2Fbilling%3Ftab%3Dcard\",\n    \"destination\": \"/account/billing?tab=card\",\n    \"purpose\": \"remove_card\"\n  }\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: cold-email-salesblink\ndescription: >\n  Run cold email sequences on autopilot and manage full sales outreach campaigns via the SalesBlink API.\n  Use this skill to build automated multi-step email campaigns (sequences), manage leads and email lists,\n  create reusable templates with merge variables and spintax, connect sending accounts (Gmail, Outlook, SMTP),\n  handle inbox replies, and track campaign analytics (opens, clicks, replies, sent).\n  Also supports bulk contact imports, email deliverability testing (inbox placement / spam checks),\n  sender warmup links, workspace/team management, and any HTTP request to the SalesBlink platform.\nversion: 1.0.0\ncompatibility: >\n  Requires network access to run.salesblink.io and a SALESBLINK_API_KEY.\n  Supports any HTTP client (curl, Node.js fetch, Python requests, PowerShell, etc.).\n  No prior knowledge of SalesBlink is needed: the skill guides you through connecting email accounts,\n  importing leads, writing templates, building sequences, launching campaigns, and monitoring deliverability.\nmetadata:\n  openclaw:\n    requires:\n      env:\n        - SALESBLINK_API_KEY\n    primaryEnv: SALESBLINK_API_KEY\n---\n\n# SalesBlink Public REST API v1.0.0\n\n## When to use this skill\n\nUse this skill when the user wants to:\n\n- Create, update, or manage email lists, sequences, templates, or senders\n- Add, update, move, or remove contacts/leads\n- Send or reply to emails via the inbox\n- Check campaign analytics (opens, clicks, replies, sent)\n- Set up outreach campaigns end-to-end\n- Manage workspaces, users, folders, or deliverability tests\n- Make any HTTP request to `run.salesblink.io/api/public/v1.0.0`\n\n## Safety & Compliance Guardrails\n\nBefore performing any high-risk action, pause and obtain explicit user confirmation. Document the confirmation in your reasoning.\n\n### Sequence launches (ASI02)\n- **Always create sequences with `paused: true` first.**\n- Before launching (setting `paused: false` or `launchTimingMode: \"now\"`), show the user:\n  - Final recipient list(s) and estimated lead count\n  - Sender account(s) that will send the emails\n  - Template subject lines and content for every step\n  - Schedule / timezone / sending hours\n  - Pause state and stop conditions (e.g., `stopWhenReplyRecieved`)\n- Only launch after the user explicitly confirms. Do not auto-launch.\n- Prefer `paused: true` and let the user resume manually when ready.\n\n### DFY orders and billing (ASI02)\n- Treat all DFY domain/mailbox orders and billing actions as **payment-sensitive**.\n- Before placing any order, confirm with the user:\n  - Exact domain name(s) to purchase or connect\n  - Mailbox count, provider (Google / Outlook / Azure), and price\n  - Cancellation limits and recurring cost implications\n- Do not place DFY orders or manage payment methods unless explicitly requested.\n\n### API key management (ASI03)\n- Only use `/keys` endpoints for **explicit credential-administration requests**.\n- Before refreshing or deleting a key, confirm:\n  - The exac"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7fnmjb3nqezc1gc8b74fmgrh84rx5t\",\n  \"slug\": \"cold-email-salesblink\",\n  \"version\": \"1.0.9\",\n  \"publishedAt\": 1778690646712\n}"},{"path":"references/account-config.md","content":"# Account Config — Domains & Signatures\n\n## Domains\n\n**GET** `/domains`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList custom tracking domains for the account.\n\n## Signatures\n\n**GET** `/signatures`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nList email signatures.\n\n> Signature IDs can be referenced when adding senders via the `signature_id` field. You can pass either the signature ID or its name."},{"path":"references/activity.md","content":"# Activity Tracking\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/sent` | GET | Log of all sent emails |\n| `/opens` | GET | Email open events |\n| `/clicks` | GET | Link click events |\n| `/replies` | GET | Reply events |\n\n## Query Parameters\n\nAll activity endpoints support:\n\n| Param | Type | Description |\n|-------|------|-------------|\n| `per_page` | integer | Max 100 |\n| `page` | integer | 1-indexed |\n| `sequence_id` | string | Filter by sequence UUID |\n| `recipient_email_address` | string | Filter by email address |\n| `since` | integer | Filter events after this timestamp (ms) |\n| `from` | integer | Start of date range (timestamp, ms) |\n| `to` | integer | End of date range (timestamp, ms) |\n\n> Use `per_page` and `page` for activity endpoints — not `limit`/`skip`.\n\n## Response Format\n\nEach event includes:\n```json\n{\n  \"id\": \"...\",\n  \"time\": 1715000000000,\n  \"message\": \"Sent\",\n  \"type\": \"outreach\",\n  \"sequence\": \"sequence-uuid\",\n  \"email\": \"lead@example.com\",\n  \"sequence_name\": \"Campaign Name\"\n}\n```\n\nFor clicks and replies, `template_name` is also included.\n\n## Examples\n\n**GET** `/opens?sequence_id=SEQ_ID&per_page=100&page=1`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\n**GET** `/replies?since=TIMESTAMP_30_DAYS_AGO&per_page=100`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`"},{"path":"references/api-keys.md","content":"# API Key Management\n\n> **Restricted**: Only use these endpoints for explicit credential-administration requests. Confirm the exact key and impact before refreshing or deleting anything.\n\n## Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/keys` | GET | List all API keys for the account |\n| `/keys` | POST | Create a new API key |\n| `/keys/:id/refresh` | POST | Refresh an existing API key (deletes old, creates new) |\n| `/keys/:id` | DELETE | Delete an API key |\n\n## Get API Keys\n\n**GET** `/keys`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nReturns a list of all API keys associated with the account.\n\n## Create API Key\n\n**POST** `/keys`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n- `Content-Type`: `application/json`\n\nBody:\n```json\n{ \"name\": \"Zapier Integration\" }\n```\n\n| Field | Type | Req | Description |\n|-------|------|-----|-------------|\n| `name` | string | ✅ | A descriptive name for the API key |\n\n## Refresh API Key\n\n**POST** `/keys/:id/refresh`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nThis endpoint generates a new API key and deletes the old one identified by `:id`. \n\n> [!WARNING]\n> If you refresh the key you are currently using, you must update your integration immediately as the old key will be revoked.\n\n## Delete API Key\n\n**DELETE** `/keys/:id`\n\nHeaders:\n- `Authorization`: `SALESBLINK_API_KEY`\n\nDeletes the specified API key.\n\n> [!IMPORTANT]\n> - You cannot delete the API key you are currently using.\n> - At least one API key is required per account. If you want to replace your only key, use the Refresh endpoint instead."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1534,"uniquenessScore":43,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T04:12:19.559Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T04:12:19.559Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T07:42:50.422Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}