New

Everything you need to scale smarter with Fixly.

Get Started
xly

API Reference

Integrate Fixly into your apps, dashboards, and workflows. Enterprise plan required.

Back to documentation

Overview

The Fixly API mirrors what you do in the product: run website analyses, pull summaries or full reports, check credits, list leads, and add leads to the same pipeline you see in the dashboard. All endpoints return JSON. Enterprise accounts can review per-key call history, credits, and operation breakdown under Dashboard → Settings → API access, and opt into a weekly API summary email there.

Base URL

https://joinfixly.com/api/v1

Auth

Bearer token

Format

JSON

Authentication

All requests require an API key passed in the Authorization header. Generate keys from Dashboard > Settings > API Keys.

Request headerHTTP
Authorization: Bearer fx_your_api_key_here

Keep your keys secure. Never expose them in client-side code or public repositories. Keys are shown only once at creation.

Rate limits & errors

API requests are rate-limited to 60 requests per minute per key. Analysis endpoints consume credits from your plan balance.

StatusMeaning
200Success
400Bad request — check parameters
401Unauthorized — invalid or missing API key
402Insufficient credits
403Forbidden — Enterprise plan required
429Quota exceeded — monthly audit limit reached
500Internal server error

Endpoints

GET/api/v1/me

Returns your account info, plan, and credit balance.

Example requestcURL
curl -H "Authorization: Bearer fx_your_key" \
  https://joinfixly.com/api/v1/me
ResponseJSON
{
  "ok": true,
  "email": "you@company.com",
  "plan": "enterprise",
  "credits": {
    "total": 5000,
    "used": 120,
    "remaining": 4880
  }
}
GET/api/v1/credits

Returns live credit balance and next reset date.

Example requestcURL
curl -H "Authorization: Bearer fx_your_key" \
  https://joinfixly.com/api/v1/credits
ResponseJSON
{
  "plan": "enterprise",
  "credits": {
    "total": 5000,
    "used": 120,
    "remaining": 4880
  },
  "reset_date": "2026-05-01T00:00:00.000Z"
}
POST/api/v1/analyze

Run an AI-powered website analysis. Consumes credits.

Request body

urlrequired
stringThe website URL to analyze (must be a valid public URL).
business_context
stringOptional context about the business for more relevant recommendations.
Example requestcURL
curl -X POST \
  -H "Authorization: Bearer fx_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com", "business_context": "B2B SaaS product"}' \
  https://joinfixly.com/api/v1/analyze
ResponseJSON
{
  "id": "a1b2c3d4-...",
  "website": "https://example.com",
  "score": 72,
  "summary": "The site has strong content but needs...",
  "subScores": {
    "seoHealth": 68,
    "conversionReadiness": 74,
    "contentQuality": 81,
    "technicalPerformance": 65,
    "trustAndCredibility": 72
  },
  "top5Fixes": [
    {
      "what": "Add structured data markup",
      "whyItMatters": "Improves search result...",
      "expectedImpact": "15-20% CTR increase",
      "priority": "critical",
      "category": "seo"
    }
  ],
  "actions_created": 5,
  "credits_consumed": 10,
  "credits_remaining": 4870,
  "trend": "first_run",
  "score_delta": null,
  "created_at": "2026-04-04T10:30:00.000Z"
}
GET/api/v1/analyses

List your past analyses with scores and timestamps.

Query parameters

limit
numberNumber of results (default 20, max 100).
offset
numberPagination offset (default 0).
Example requestcURL
curl -H "Authorization: Bearer fx_your_key" \
  "https://joinfixly.com/api/v1/analyses?limit=10&offset=0"
ResponseJSON
{
  "analyses": [
    {
      "id": "a1b2c3d4-...",
      "website": "https://example.com",
      "score": 72,
      "created_at": "2026-04-04T10:30:00.000Z"
    }
  ],
  "pagination": { "limit": 10, "offset": 0, "count": 1 }
}
GET/api/v1/analyses/:id

Get summary fields for one analysis. Append ?full=true for the complete stored JSON (same payload shape as in-app, large).

Query parameters

full
booleanPass "true" or "1" to include the full result object under "result".
Example requestcURL
curl -H "Authorization: Bearer fx_your_key" \
  "https://joinfixly.com/api/v1/analyses/a1b2c3d4-...?full=true"
ResponseJSON
{
  "id": "a1b2c3d4-...",
  "website": "https://example.com",
  "score": 72,
  "summary": "The site has strong content but needs...",
  "subScores": { ... },
  "top5Fixes": [ ... ],
  "deterministicChecks": [ ... ],
  "recheckDelta": {
    "previousScore": 65,
    "currentScore": 72,
    "scoreDelta": 7,
    "trend": "improved"
  },
  "created_at": "2026-04-04T10:30:00.000Z"
}
GET/api/v1/leads

Retrieve your saved leads with contact details.

Example requestcURL
curl -H "Authorization: Bearer fx_your_key" \
  https://joinfixly.com/api/v1/leads
ResponseJSON
{
  "leads": [
    {
      "id": "l1m2n3o4-...",
      "company": "Acme Corp",
      "website": "https://acme.com",
      "contact_name": "Jane Doe",
      "contact_email": "jane@acme.com",
      "industry": "SaaS",
      "status": "new",
      "created_at": "2026-04-03T08:00:00.000Z"
    }
  ],
  "count": 1
}
POST/api/v1/leads

Create a lead in your Fixly workspace — same rules and monthly caps as adding a lead in the dashboard.

Request body (JSON)

company_namerequired
stringOrganization or person name.
websiterequired
stringPrimary site or portfolio URL.
contact_name
stringOptional.
contact_email
stringOptional.
contact_phone
stringOptional.
job_title
stringOptional.
industry
stringOptional.
lead_source
stringOptional (e.g. API, webinar).
notes
stringOptional.
linkedin_url
stringOptional — personal /in/ profile URLs only; company pages are dropped.
instagram_url
stringOptional.
x_url
stringOptional.
Example requestcURL
curl -X POST \
  -H "Authorization: Bearer fx_your_key" \
  -H "Content-Type: application/json" \
  -d '{"company_name":"Acme Corp","website":"https://acme.com","contact_email":"jane@acme.com","lead_source":"CRM sync"}' \
  https://joinfixly.com/api/v1/leads
ResponseJSON
{
  "ok": true,
  "lead": {
    "id": "…",
    "company_name": "Acme Corp",
    "website": "https://acme.com",
    "contact_email": "jane@acme.com",
    "status": "new",
    "created_at": "2026-04-04T12:00:00.000Z"
  }
}

Quick-start examples

Node.js / JavaScript

analyze.jsJavaScript
const API_KEY = "fx_your_api_key";
const BASE = "https://joinfixly.com/api/v1";

async function analyzeWebsite(url) {
  const res = await fetch(`${BASE}/analyze`, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ url }),
  });

  if (!res.ok) {
    const err = await res.json();
    throw new Error(err.message);
  }

  return res.json();
}

// Run an analysis
const result = await analyzeWebsite("https://example.com");
console.log("Score:", result.score);
console.log("Fixes:", result.top5Fixes);

async function createLead(payload) {
  const res = await fetch(`${BASE}/leads`, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(payload),
  });
  if (!res.ok) {
    const err = await res.json();
    throw new Error(err.message ?? err.error);
  }
  return res.json();
}

// Same as dashboard “Add lead”
await createLead({
  company_name: "Acme Corp",
  website: "https://acme.com",
  contact_email: "jane@acme.com",
  lead_source: "Your product",
});

Python

analyze.pyPython
import requests

API_KEY = "fx_your_api_key"
BASE = "https://joinfixly.com/api/v1"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}

# Run an analysis
resp = requests.post(
    f"{BASE}/analyze",
    headers=headers,
    json={"url": "https://example.com"},
)
data = resp.json()
print(f"Score: {data['score']}")

# List past analyses
analyses = requests.get(f"{BASE}/analyses", headers=headers).json()
for a in analyses["analyses"]:
    print(f"{a['website']} → {a['score']}/100")

# Create a lead (same as dashboard)
lead_resp = requests.post(
    f"{BASE}/leads",
    headers=headers,
    json={
        "company_name": "Acme Corp",
        "website": "https://acme.com",
        "contact_email": "jane@acme.com",
        "lead_source": "Your product",
    },
)
lead_resp.raise_for_status()
print(lead_resp.json()["lead"]["id"])

Need help?

Have questions about the API or need a higher rate limit? Contact our team — we typically respond within 24 hours.