Wahlu API

Admin Marketing

Admin-only prospecting, website scan, generation, and sample-pack endpoints.

These endpoints support Wahlu's admin-only prospecting workflow: creating prospect brands, running website scans, triggering the content pipeline, and fetching an outreach-ready sample pack.

These routes are admin-only. Your API key must carry the required admin scope, and the owning user must have an admin role in Wahlu.

Create a prospect brand

Required scope: admin:marketing

POST/v1/admin/brands
ParameterTypeDescription
name*stringBusiness or brand name.
descriptionstringOptional description for internal context.

Update onboarding state

Required scope: admin:marketing

PATCH/v1/admin/brands/:brand_id

Use this to set mode, website, posting cadence, timezone, business category, and onboarding step before generation.

curl
curl https://api.wahlu.com/v1/admin/brands/brand_abc123 \
  -X PATCH \
  -H "Authorization: Bearer wahlu_live_admin_key" \
  -H "Content-Type: application/json" \
  -d '{
    "onboarding_step": "completed",
    "config": {
      "mode": "automatic",
      "website": "https://acme.com",
      "business_category": "local_service",
      "timezone": "America/New_York",
      "image_posting": {
        "cross_post": "always",
        "cross_posts_per_week": 3
      },
      "video_posting": {
        "cross_post": "always",
        "cross_posts_per_week": 3
      }
    }
  }'

Start and monitor a website scan

Start requires admin:marketing. Polling requires admin:read.

POST/v1/admin/brands/:brand_id/website-scan
GET/v1/admin/brands/:brand_id/website-scan

The POST route stores the website URL, seeds scan progress, and triggers the worker process. Poll the GET route until all steps are completed or one of them failed.

Get brand orchestration status

Required scope: admin:read

GET/v1/admin/brands/:brand_id/status

Returns the onboarding step, mode, website scan progress, generation status, and automation metadata for one brand.

Queue the content pipeline

Required scope: admin:marketing

POST/v1/admin/brands/:brand_id/content-pipeline

This route only works for brands in automatic mode. If a plan is already active or generation is already running, the response will tell you whether a new run was queued.

Fetch the marketing sample pack

Required scope: admin:read

GET/v1/admin/brands/:brand_id/marketing-sample-pack?limit=3

This is the safest endpoint for outreach. It only marks ready: true when Wahlu can return enough usable samples with captions and downloadable media.

Response
{
  "success": true,
  "data": {
    "ready": true,
    "reason": "ready",
    "brand": {
      "id": "brand_abc123",
      "name": "Acme Dental",
      "website": "https://acmedental.com"
    },
    "samples": [
      {
        "content_item_id": "post_1",
        "name": "3 Signs You Should Book a Check-Up",
        "caption": "If it has been a while since your last clean, here are three reasons to book in.",
        "hashtags": ["dental", "oralhealth"],
        "title": null,
        "media": [
          {
            "media_id": "media_1",
            "download_url": "https://storage.googleapis.com/...",
            "content_type": "image/png",
            "file_name": "post-1.png"
          }
        ],
        "created_at": "2026-03-23T10:00:00.000Z"
      }
    ]
  }
}

Create a claim link

Required scope: admin:marketing

POST/v1/admin/brands/:brand_id/claim-link

Creates a claimable preview link that lets a prospect review the generated brand and bring it into their own workspace. Omit ttl_hours for a non-expiring link, or pass a number to enforce a time limit.

ParameterTypeDescription
ttl_hoursnumber | nullOptional lifetime in hours. Omit or pass null for no expiry.