API Reference

Upscale APIs for personalised LinkedIn outreach. Integrate message generation and retrieval with your tools.

Introduction

The Upscale API lets you integrate personalised LinkedIn message generation with your systems. Send prospects, receive generated messages, and get notified when processing is complete.

Base URL

https://app.upscaleoutreach.com/api/v2

Authentication

Every request must include your API key in the Api-Key header. You can find your API keys in your account settings.

HeaderRequiredDescription
Api-KeyYesYour API key value

Requests without a valid, non-revoked API key receive 401 Unauthorized.

Requests with a body (e.g. POST)

For endpoints that send a request body (such as Request Message Generation), send the body as JSON and include Content-Type: application/json in the headers. GET requests do not have a body and do not require this header.

Quick start

If you want to see some example messages immediately, use the curl below and paste in your API key. The response will include a secure_request_id; once generation has finished (or after a short wait), use the retrieve curl with that ID to fetch the generated messages.

Please note that if you would like to generate more messages after this, the system will de-duplicate same requests. It will also de-duplicate same message type requests for same lead id. Please change the lead id if you would like to generate new messages.

1. Request message generation

curl -X POST "https://app.upscaleoutreach.com/api/v2/messages/request_message_generation" \
  -H "Content-Type: application/json" \
  -H "Api-Key: <your-api-key-here>" \
  -d '{
  "completion_notification_url": "https://webhook.site/7f329acb-290c-4edb-9448-6066635883b3",
  "automation_tool_customer_id": "agency_id_xyz123456",
  "automation_tool_campaign_id": "campaign_xyz567890",
  "automation_tool_campaign_name": "Campaign A",
  "proposition_company_name": "Upscale Outreach",
  "proposition_company_url": "https://www.upscaleoutreach.com",
  "message_sequence": [{ "step": 1, "messageType": "connection_request" }, { "step": 2, "messageType": "first_follow_up" }, {"step": 3, "messageType": "share_material"}, { "step": 4, "messageType": "stage_ambition" }, {"step": 5, "messageType": "hiring_activity"}],
  "material_link_one": "https://www.upscaleoutreach.com/posts/personalise-linkedin-messages-at-scale-without-spending-hours",
  "hiring_location": "us",
  "signoff_name": "Charlie",
  "tone_preference": "normal",
  "lead_data": [
    {
      "automation_tool_lead_id": "lead_4d5e6",
      "lead_linkedin": "https://ee.linkedin.com/in/uku-taht",
      "lead_company": "Plausible",
      "first_name": "Uku",
      "last_name": "Taht",
      "lead_company_website_url": null,
      "lead_specified_url": null,
      "job_title": "Founder"
    },
    {
      "automation_tool_lead_id": "lead_1a2b3",
      "lead_linkedin": "https://www.linkedin.com/in/kathleen-bellah-842a8377",
      "lead_company": "Accenture",
      "first_name": "Kathleen",
      "last_name": "Bellah",
      "lead_company_website_url": null,
      "lead_specified_url": null,
      "job_title": "Senior Managing Director"
    }
  ]
}'

2. Retrieve the generated messages

Replace your_secure_request_id_here with the secure_request_id from the first response, and your_api_key_here with your API key.

curl --location --request GET 'https://app.upscaleoutreach.com/api/v2/messages/retrieve_messages?request_message_generation_secure_request_id=your_secure_request_id_here' \
--header 'Api-Key: your_api_key_here'

Errors

The API returns standard HTTP status codes with JSON response bodies.

Status codeMeaning
200OK (success or duplicate)
202Accepted (retrieve_messages, generation in progress)
401Unauthorized (bad or revoked API key)
402Payment required (request_message_generation only)
403Forbidden (retrieve_messages only)
404Not found (retrieve_messages only)
422Unprocessable entity (validation)
429Too many requests (rate limit)

Example error responses

Error responses are JSON with an error field describing the issue.

Status codeScenarioResponse body
401 UnauthorizedInvalid API key{"error": "Unauthorized: Invalid API key"}
401 UnauthorizedRevoked API key{"error": "Unauthorized: API key has been revoked"}
402 Payment RequiredInsufficient credits{"error": "Not enough credits remaining to complete this request. Please upgrade your plan or purchase a bundle."}
422 Unprocessable EntityValidation error{"error": "message_sequence must be an array"}
429 Too Many RequestsRate limit exceeded{"error": "Rate limit exceeded"}

Rate limits

Rate limits apply per account (across all API keys on that account) and help ensure fair usage and system stability.

What they do

  • Apply per account (across all API keys on that account).
  • Two kinds: API requests (number of calls) and messages requested (number of messages you request to be generated).
  • Windows: per calendar minute and per calendar day (UTC).
  • If any limit is exceeded, the API returns 429 Too Many Requests and the request is not processed.

Testing phase

Use when validating your integration or doing light load tests.

Limit typePer minutePer day
API requests202,000
Messages requested101,000

Normal production

Use for live traffic and higher throughput.

Limit typePer minutePer day
API requests300100,000
Messages requested400120,000

Future production

Higher throughput tier for accounts with elevated volume.

Limit typePer minutePer day
API requests1,350417,000
Messages requested1,800500,000

Rate limits will be increased in line with growing volumes on the platform.

APIs & Webhooks

Each API and webhook is documented on its own page. Use the sidebar or the links below.