HTTP API

Pageship API

Submit website requests programmatically — a non-binding inquiry to have a website created, free and with no purchase required. Built for AI agents, automation, and custom integrations. No authentication required.

Endpoints

GET

/api/openapi.json

OpenAPI 3.1 spec — for Postman, Insomnia, SDK generation, AI agents

POST

/api/website

Submit a website request — returns a request ID and optional upload URLs

POST

/api/website

Submits a non-binding website request. The request is forwarded internally by email and the customer is notified, then the Pageship team follows up with a free preview. If attachments are provided, the response includes pre-signed upload URLs for bunny.net Storage.

request
POST https://pageship.de/api/website
Content-Type: application/json

Request body

contactRequired

Contact details of the customer making the request.

  • firstName
    stringFirst name
  • lastName
    stringLast name
  • email
    stringEmail address
  • phone
    stringPhone number
  • company
    stringCompany name
billingOptional

Billing address, in case the customer wants to provide it upfront.

  • name
    stringBilling recipient
  • company
    stringCompany (if different)
  • street
    stringStreet and house number
  • zip
    stringPostal code
  • city
    stringCity
  • country
    stringCountry code ISO 3166-1 alpha-2, e.g. DE
  • vatId
    stringVAT ID (for B2B)
  • email
    stringBilling email (if different)
questionnaireRequired

Website questionnaire — sub-objects basics, goals, pages, design, features and imprint.

basicsOptional
  • brandName
    stringBrand or company name
  • offer
    stringShort description of the offering, 1–2 sentences
  • location
    stringLocation
  • serviceArea
    stringService area / catchment area
  • contactMethods
    string[]phone, email, contact_form, whatsapp
  • hasLogo
    booleanLogo available?
  • brandColors
    string[]Hex color values, e.g. ["#2d6a4f"]
goalsOptional
  • primaryGoal
    stringMain goal of the website
  • primaryCta
    stringFirst action visitors should take
  • targetAudience
    stringDescription of the target audience
pagesOptional
  • type
    stringone_pager or multi_page
  • pages
    string[]Desired subpages (multi_page)
  • contentStatus.textsAvailable
    booleanCustomer-provided texts available?
  • contentStatus.imagesAvailable
    booleanCustomer-provided images available?
  • contentStatus.imageCount
    integerNumber of available images
designOptional
  • tone
    stringDesired tone, e.g. "professional, modern, friendly"
  • referenceUrls
    string[]Style reference URLs
  • styleNotes
    stringAdditional design notes
featuresOptional
  • contactForm
    booleanContact form
  • newsletter
    booleanNewsletter integration
  • booking
    booleanBooking / appointment system
  • shop
    booleanOnline shop
  • blog
    booleanBlog
  • gallery
    booleanImage gallery / portfolio section
  • languages
    string[]ISO 639-1 language codes, e.g. ["de"]
  • hasPrivacyPolicy
    booleanPrivacy policy already available?
  • hasTerms
    booleanTerms and conditions already available?
imprintOptional
  • legalForm
    stringLegal form, e.g. Einzelunternehmen, GmbH, UG
  • representative
    stringAuthorised representative / managing director
  • registerCourt
    stringRegister court
  • registerNumber
    stringCommercial register number (HRB/HRA)
domainOptional
  • requested
    Desired domain, e.g. my-business.de
  • suggest
    Pageship should suggest suitable domains
  • tlds
    Preferred TLDs, default: [".de"]
attachmentsOptional

Files are not transmitted directly. The API returns pre-signed upload URLs; files are then uploaded via PUT directly to those URLs. Each entry contains filename and mimeType.

  • logoobject
    max 1 · png, jpeg, webp, svg+xml, gif
  • photosarray
    max 20 · png, jpeg, webp, svg+xml, gif
  • videosarray
    max 5 · mp4, webm, quicktime
  • docsarray
    max 10 · application/pdf
notesoptional · max. 2000 characters — free text for special requests or notes.

Sample request

POST /api/website
{
  "contact": {
    "firstName": "Max",
    "lastName": "Mustermann",
    "email": "max@mustermann.de",
    "phone": "+49 151 12345678",
    "company": "Mustermann GmbH"
  },
  "billing": {
    "name": "Max Mustermann",
    "company": "Mustermann GmbH",
    "street": "Musterstraße 42",
    "zip": "10115",
    "city": "Berlin",
    "country": "DE",
    "vatId": "DE123456789"
  },
  "questionnaire": {
    "basics": {
      "brandName": "Mustermann Garden Design",
      "offer": "Professional garden design and maintenance for private customers in the Berlin area.",
      "location": "Berlin",
      "serviceArea": "Berlin & Brandenburg (up to 50 km)",
      "contactMethods": ["phone", "email", "contact_form"],
      "hasLogo": true,
      "brandColors": ["#2d6a4f", "#ffffff"]
    },
    "goals": {
      "primaryGoal": "Acquire new customers",
      "primaryCta": "Request a free quote",
      "targetAudience": "Private homeowners with a garden, age 35–65"
    },
    "pages": {
      "type": "multi_page",
      "pages": ["Home", "Services", "About", "Contact"],
      "contentStatus": {
        "textsAvailable": false,
        "imagesAvailable": true,
        "imageCount": 12
      }
    },
    "design": {
      "tone": "professional, trustworthy, natural",
      "styleNotes": "Plenty of whitespace, clean structure, natural colors"
    },
    "features": {
      "contactForm": true,
      "newsletter": false,
      "booking": false,
      "shop": false,
      "blog": false,
      "gallery": true,
      "languages": ["de"],
      "hasPrivacyPolicy": false,
      "hasTerms": false
    }
  },
  "domain": {
    "requested": "mustermann-garten.de",
    "suggest": true,
    "tlds": [".de", ".com"]
  },
  "attachments": {
    "logo": { "filename": "logo.svg", "mimeType": "image/svg+xml" },
    "photos": [
      { "filename": "garden-01.jpg", "mimeType": "image/jpeg" }
    ]
  },
  "notes": "Please test the logo on both white and dark green backgrounds."
}

Responses

201 CreatedRequest successfully submitted
201 response
{
  "id": "ws_01j9k2m3n4p5q6r7s8t9",
  "status": "pending",
  "createdAt": "2026-04-27T10:00:00Z",
  "uploadUrls": {
    "logo": {
      "filename": "logo.svg",
      "url": "https://storage.bunnycdn.com/pageship-uploads/ws_.../logo/logo.svg?token=...&expires=...",
      "method": "PUT",
      "expiresAt": "2026-04-28T10:00:00Z"
    },
    "photos": [
      {
        "filename": "garden-01.jpg",
        "url": "https://storage.bunnycdn.com/pageship-uploads/ws_.../photos/garden-01.jpg?token=...",
        "method": "PUT",
        "expiresAt": "2026-04-28T10:00:00Z"
      }
    ]
  }
}

uploadUrls is only present when attachments were provided in the request. Upload URLs are valid for 24 hours.

422 Unprocessable EntityValidation error
422 response
{
  "error": "validation_failed",
  "fields": {
    "contact.email": "Required field missing",
    "questionnaire.basics.brandName": "Required field missing"
  }
}

File upload

Files are not transmitted in the API request itself. Instead, after a successful request the API returns pre-signed PUT URLs. Files are uploaded directly via PUT to bunny.net Storage — no Authorization header needed, the URL is already signed.

1

Submit the request

POST https://pageship.de/api/website
Content-Type: application/json

{ ..., "attachments": { "logo": { "filename": "logo.png", "mimeType": "image/png" } } }
2

Upload the file directly to bunny.net

PUT {uploadUrls.logo.url}
Content-Type: image/png

<binary file data>

AI integration

The Pageship API is designed to work directly with AI agents and automation frameworks.

OpenAPI / Postman

Import via /api/openapi.json — compatible with Postman, Insomnia, Bruno, and API marketplaces.

ChatGPT / LangChain

Discovery via ai-plugin.json — standard manifest for ChatGPT Actions and agent frameworks.

LLM Context

Short: /llms.txt — Full: /llms-full.txt (incl. complete API docs, llmstxt.org standard).