KDaaS API

Kentico Developer as a Service — programmatic access to expert Xperience by Kentico development.

Authentication

KDaaS supports two authentication methods. All authenticated endpoints require one of these.

API Key (Bearer Token)

After purchasing a package or hourly block through Stripe checkout, you receive an API key. Include it in every request:

Authorization: Bearer YOUR_API_KEY

Your API key is tied to your account and grants access to create sessions, manage artifacts, and view account details. It never expires, but can be rotated from the dashboard.

L402 Lightning Authentication

AI agents and programmatic clients can pay per-session via the Lightning Network using the L402 protocol. No account or signup required — payment is authentication.

L402 flow:
1. POST to the L402 proxy URL (see /api/pricing for the URL).
2. Receive HTTP 402 with a Lightning invoice in the WWW-Authenticate header.
3. Pay the invoice to get a preimage.
4. Retry with: Authorization: L402 <macaroon>:<preimage>
5. Token is valid for 1 hour (all requests within the session window use the same token).

Magic Link (Dashboard)

For browser-based dashboard access, request a magic link sent to your email. The link contains a one-time token valid for 15 minutes. After verification, you receive your API key for subsequent requests.

Getting Started

The typical workflow for human clients:

  1. Get pricing: GET /api/pricing to see available packages and hourly rates.
  2. Purchase a package: POST /api/checkout to create a Stripe checkout session. Complete payment to receive your API key.
  3. Create a session: POST /api/session/create with your API key. This deducts hours from your balance.
  4. Send messages: POST /api/session/{id}/message to interact with the Kentico development agent.
  5. Get artifacts: GET /api/session/{id}/artifacts to retrieve generated code files.
Quick test: The health and pricing endpoints require no authentication, so you can start exploring the API immediately.

Base URL

https://kentico-developer.com

Capability Values

When creating a session, specify the type of Kentico work you need:

ValueDescription
GeneralGeneral Kentico development questions and tasks
WidgetPage Builder widget development
ContentTypeContent type creation and modeling
MigrationKX13 to Xperience by Kentico migration
TemplatePage Builder template development

Health

GET /api/health No auth

Check service health and database connectivity.

Response
{
  "status": "healthy",
  "service": "KDaaS",
  "database": "healthy",
  "timestamp": "2026-03-10T12:00:00Z"
}
Example
curl https://kentico-developer.com/api/health

Pricing

GET /api/pricing No auth

Get all pricing information including packages, hourly rates, and L402 Lightning access details.

Query ParamTypeDescription
btcPrice optionaldecimalOverride BTC/USD price for sats calculation. If omitted, uses live price.
Response
{
  "service": "kentico-developer.com",
  "tagline": "Expert Xperience by Kentico development...",
  "freeConsultation": {
    "duration": "30 minutes",
    "description": "Free assessment call...",
    "bookingUrl": "/book"
  },
  "packages": [ ... ],
  "hourlyRate": {
    "rateUsd": 250.00,
    "sessions": [ ... ]
  },
  "l402Access": {
    "proxyUrl": "https://api.lightningenable.com/l402/proxy/...",
    "sessionCreatePath": "/api/session/create",
    "currentPriceSats": 262500,
    "sessionDurationMinutes": 60,
    "protocol": "L402",
    "instructions": "POST to ProxyUrl + SessionCreatePath..."
  }
}
Example
curl https://kentico-developer.com/api/pricing
curl https://kentico-developer.com/api/pricing?btcPrice=100000
GET /api/pricing/packages No auth

List all available fixed-price packages.

Example
curl https://kentico-developer.com/api/pricing/packages
GET /api/pricing/packages/{packageId} No auth

Get details for a specific package by ID.

Example
curl https://kentico-developer.com/api/pricing/packages/widget-single

Checkout

POST /api/checkout No auth

Create a Stripe checkout session to purchase a package or hourly block.

Request Body
{
  "packageId": "widget-single",
  "email": "client@example.com"
}
FieldTypeDescription
packageId requiredstringPackage ID from /api/pricing/packages, or "hourly-1" for a 1-hour block.
email optionalstringPre-fill the customer email on the Stripe checkout page.
Response
{
  "url": "https://checkout.stripe.com/c/pay/cs_..."
}
Example
curl -X POST https://kentico-developer.com/api/checkout \
  -H "Content-Type: application/json" \
  -d '{"packageId": "widget-single", "email": "client@example.com"}'
GET /api/checkout/session?sessionId={cs_...} No auth

Check the status of a Stripe checkout session. Returns the API key on successful payment.

Query ParamTypeDescription
sessionId requiredstringStripe checkout session ID (starts with cs_).
Response (paid)
{
  "packageName": "Single Widget",
  "amount": 50000,
  "email": "client@example.com",
  "status": "paid",
  "apiKey": "kdaas_abc123..."
}
Example
curl "https://kentico-developer.com/api/checkout/session?sessionId=cs_test_..."

Contact

POST /api/contact No auth

Submit a contact form inquiry. Sends email notifications and an auto-reply to the submitter.

Request Body
{
  "name": "Jane Doe",
  "email": "jane@example.com",
  "message": "I need a custom widget built...",
  "company": "Acme Corp",
  "kenticoVersion": "29.0",
  "packageInterest": "widget-single"
}
FieldTypeDescription
name requiredstringYour name.
email requiredstringValid email address.
message requiredstringYour message (max 5,000 characters).
company optionalstringCompany name.
kenticoVersion optionalstringYour Kentico version.
packageInterest optionalstringPackage you are interested in.
Response
{
  "message": "Thank you! We'll be in touch within 1 business day."
}
Example
curl -X POST https://kentico-developer.com/api/contact \
  -H "Content-Type: application/json" \
  -d '{"name":"Jane","email":"jane@example.com","message":"Need a widget."}'

Session Endpoints

POST /api/session/create Auth required

Create a new development session. Deducts hours from your account balance (API key auth) or uses a pre-paid Lightning invoice (L402 auth).

Request Body
{
  "capability": "Widget",
  "durationMinutes": 60
}
FieldTypeDescription
capability optionalstringOne of: General, Widget, ContentType, Migration, Template. Defaults to General.
durationMinutes optionalintSession duration: 15, 30, or 60. Defaults to 60. L402 sessions are always 60 minutes.
Response
{
  "sessionId": "a1b2c3d4e5f6...",
  "capability": "Widget",
  "expiresAt": "2026-03-10T13:00:00Z",
  "durationMinutes": 60
}
Returns 402 Payment Required if your account has insufficient hours balance. The response includes a purchaseUrl to buy more hours.
Example
curl -X POST https://kentico-developer.com/api/session/create \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"capability": "Widget", "durationMinutes": 60}'
GET /api/session/{sessionId} Auth required

Get session details including expiry status and message/artifact counts.

Response
{
  "id": "a1b2c3d4e5f6...",
  "capability": "Widget",
  "createdAt": "2026-03-10T12:00:00Z",
  "expiresAt": "2026-03-10T13:00:00Z",
  "isExpired": false,
  "messageCount": 5,
  "artifactCount": 3
}
Example
curl https://kentico-developer.com/api/session/a1b2c3d4e5f6 \
  -H "Authorization: Bearer YOUR_API_KEY"
POST /api/session/{sessionId}/message Auth required

Send a message to the Kentico development agent within an active session. The agent responds with text and may produce code artifacts.

Request Body
{
  "message": "Build me a hero banner widget with a title, subtitle, background image, and CTA button."
}
FieldTypeDescription
message requiredstringYour message to the agent. Max 100,000 characters.
Response
{
  "messageId": "msg_abc123",
  "response": "I'll build a hero banner widget for you...",
  "timestamp": "2026-03-10T12:05:00Z",
  "artifacts": [
    {
      "id": "art_xyz",
      "fileName": "HeroBannerWidgetViewComponent.cs",
      "language": "csharp"
    }
  ]
}
Returns 402 Payment Required if the session has expired. You will need to create a new session to continue.
Example
curl -X POST https://kentico-developer.com/api/session/a1b2c3d4e5f6/message \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"message": "Build a hero banner widget with title, image, and CTA."}'

Artifact Endpoints

Artifacts are code files generated during a session. These endpoints operate on artifacts within a specific session.

GET /api/session/{sessionId}/artifacts Auth required

List all artifacts generated in a session.

Response
[
  {
    "id": "art_xyz",
    "fileName": "HeroBannerWidgetViewComponent.cs",
    "language": "csharp",
    "createdAt": "2026-03-10T12:05:00Z"
  }
]
Example
curl https://kentico-developer.com/api/session/a1b2c3d4e5f6/artifacts \
  -H "Authorization: Bearer YOUR_API_KEY"
GET /api/session/{sessionId}/artifacts/{artifactId} Auth required

Get a specific artifact including its full source code content.

Response
{
  "id": "art_xyz",
  "fileName": "HeroBannerWidgetViewComponent.cs",
  "language": "csharp",
  "content": "using Microsoft.AspNetCore.Mvc;\n...",
  "createdAt": "2026-03-10T12:05:00Z"
}
Example
curl https://kentico-developer.com/api/session/a1b2c3d4e5f6/artifacts/art_xyz \
  -H "Authorization: Bearer YOUR_API_KEY"
GET /api/session/{sessionId}/artifacts/{artifactId}/download Auth required

Download a single artifact as a file (binary download).

Returns application/octet-stream with the original filename in the Content-Disposition header.

Example
curl -O -J https://kentico-developer.com/api/session/a1b2c3d4e5f6/artifacts/art_xyz/download \
  -H "Authorization: Bearer YOUR_API_KEY"
GET /api/session/{sessionId}/artifacts/zip Auth required

Download all session artifacts as a single ZIP archive.

Returns application/zip with filename kdaas-{sessionId}.zip.

Example
curl -O -J https://kentico-developer.com/api/session/a1b2c3d4e5f6/artifacts/zip \
  -H "Authorization: Bearer YOUR_API_KEY"

Account Endpoints

Account endpoints let you manage your account, view session history, review artifacts, and submit project specs. All require API key authentication.

GET /api/account Auth required

Get your account details including hours balance and purchase history.

Response
{
  "email": "client@example.com",
  "hoursBalance": 4.5,
  "createdAt": "2026-01-15T10:00:00Z",
  "purchaseCount": 2,
  "purchases": [
    {
      "id": "pur_abc",
      "packageId": "widget-single",
      "amountUsd": 500.00,
      "hoursAdded": 2.0,
      "purchasedAt": "2026-01-15T10:00:00Z"
    }
  ]
}
Example
curl https://kentico-developer.com/api/account \
  -H "Authorization: Bearer YOUR_API_KEY"
GET /api/account/sessions Auth required

List all sessions associated with your account, ordered by most recent.

Response
[
  {
    "id": "a1b2c3d4e5f6...",
    "capability": "Widget",
    "createdAt": "2026-03-10T12:00:00Z",
    "expiresAt": "2026-03-10T13:00:00Z",
    "isExpired": true,
    "artifactCount": 4
  }
]
Example
curl https://kentico-developer.com/api/account/sessions \
  -H "Authorization: Bearer YOUR_API_KEY"
GET /api/account/artifacts Auth required

List all artifacts across all your sessions, ordered by most recent.

Response
[
  {
    "id": "art_xyz",
    "fileName": "HeroBannerWidgetViewComponent.cs",
    "language": "csharp",
    "sessionId": "a1b2c3d4e5f6...",
    "createdAt": "2026-03-10T12:05:00Z"
  }
]
Example
curl https://kentico-developer.com/api/account/artifacts \
  -H "Authorization: Bearer YOUR_API_KEY"
GET /api/account/artifacts/{artifactId} Auth required

Get a specific artifact with full content, review status, and notes.

Response
{
  "id": "art_xyz",
  "fileName": "HeroBannerWidgetViewComponent.cs",
  "language": "csharp",
  "content": "using Microsoft.AspNetCore.Mvc;\n...",
  "status": "pending",
  "version": 1,
  "reviewNotes": null,
  "reviewedAt": null,
  "sessionId": "a1b2c3d4e5f6...",
  "createdAt": "2026-03-10T12:05:00Z"
}
Example
curl https://kentico-developer.com/api/account/artifacts/art_xyz \
  -H "Authorization: Bearer YOUR_API_KEY"
POST /api/account/artifacts/{artifactId}/approve Auth required

Mark an artifact as approved.

Response
{
  "id": "art_xyz",
  "status": "approved",
  "reviewedAt": "2026-03-10T14:00:00Z"
}
Example
curl -X POST https://kentico-developer.com/api/account/artifacts/art_xyz/approve \
  -H "Authorization: Bearer YOUR_API_KEY"
POST /api/account/artifacts/{artifactId}/request-revision Auth required

Request a revision on an artifact with notes explaining what needs to change.

Request Body
{
  "notes": "The widget needs responsive breakpoints for mobile."
}
FieldTypeDescription
notes requiredstringDescription of what needs to be revised.
Response
{
  "id": "art_xyz",
  "status": "revision_requested",
  "reviewNotes": "The widget needs responsive breakpoints for mobile.",
  "reviewedAt": "2026-03-10T14:00:00Z"
}
Example
curl -X POST https://kentico-developer.com/api/account/artifacts/art_xyz/request-revision \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"notes": "Need responsive breakpoints for mobile."}'

Project Specs

Submit detailed project specifications for review. Useful for scoping larger packages before starting development sessions.

POST /api/account/spec Auth required

Submit a new project specification for review.

Request Body
{
  "title": "E-commerce Product Catalog",
  "description": "Build content types and widgets for a product catalog...",
  "packageType": "content-types-5",
  "contentTypes": "Product, Category, Brand",
  "widgetNames": "ProductCard, CategoryGrid",
  "kenticoVersion": "29.0",
  "migrationSource": "KX13",
  "additionalNotes": "Need Shopify integration"
}
FieldTypeDescription
title requiredstringProject title.
description requiredstringDetailed project description.
packageType optionalstringPackage ID this spec relates to.
contentTypes optionalstringContent types involved.
widgetNames optionalstringWidget names involved.
kenticoVersion optionalstringTarget Kentico version.
migrationSource optionalstringSource CMS for migrations.
additionalNotes optionalstringAny additional context or requirements.
Response (201 Created)
{
  "id": "spec_abc",
  "title": "E-commerce Product Catalog",
  "status": "submitted",
  "submittedAt": "2026-03-10T12:00:00Z"
}
Example
curl -X POST https://kentico-developer.com/api/account/spec \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Product Catalog","description":"Build content types for products."}'
GET /api/account/specs Auth required

List all your project specs, ordered by most recent.

Response
[
  {
    "id": "spec_abc",
    "title": "E-commerce Product Catalog",
    "packageType": "content-types-5",
    "status": "submitted",
    "submittedAt": "2026-03-10T12:00:00Z",
    "reviewedAt": null
  }
]
Example
curl https://kentico-developer.com/api/account/specs \
  -H "Authorization: Bearer YOUR_API_KEY"
GET /api/account/spec/{specId} Auth required

Get full details of a specific project spec.

Example
curl https://kentico-developer.com/api/account/spec/spec_abc \
  -H "Authorization: Bearer YOUR_API_KEY"

Passwordless authentication via magic links. Used primarily by the web dashboard.

POST /api/auth/magic-link No auth

Request a magic login link sent to your email. Always returns 200 regardless of whether the email exists (prevents enumeration).

Request Body
{
  "email": "client@example.com"
}
FieldTypeDescription
email requiredstringThe email address associated with your account.
Response
{
  "message": "If an account exists for that email, a login link has been sent."
}
Example
curl -X POST https://kentico-developer.com/api/auth/magic-link \
  -H "Content-Type: application/json" \
  -d '{"email": "client@example.com"}'
POST /api/auth/verify No auth

Verify a magic link token and receive your API key. Tokens expire after 15 minutes and are single-use.

Request Body
{
  "token": "eyJhbGciOi..."
}
FieldTypeDescription
token requiredstringThe token from the magic link URL.
Response
{
  "apiKey": "kdaas_abc123...",
  "email": "client@example.com",
  "hoursBalance": 4.5
}
Example
curl -X POST https://kentico-developer.com/api/auth/verify \
  -H "Content-Type: application/json" \
  -d '{"token": "eyJhbGciOi..."}'

Error Responses

All errors return a JSON object with an error field:

{
  "error": "Description of what went wrong"
}
StatusMeaning
400Bad request — invalid parameters or missing required fields.
401Unauthorized — missing or invalid API key / L402 token.
402Payment required — insufficient hours balance or expired session.
404Not found — resource does not exist or you don't have access.
503Service unavailable — database or dependent service is down.

KDaaS — Kentico Developer as a Service
kentico-developer.com

Privacy · Terms · Refund Policy · Contact