Duskly
Todas las herramientasStaging virtualDe día a atardecerHerramientas gratuitasPrecios
Start here

Developers and agents

Duskly has one public API endpoint and a set of machine-readable descriptions of the site. There is no key, no account and no sandbox to register for.

Machine-readable index

  • /llms.txt: what this site is, when to use it,

when not to, and what it does not claim.

  • /openapi.json: OpenAPI 3.1 description.
  • /.well-known/api-catalog: RFC

9727 linkset pointing at the description above.

  • /sitemap.xml: every page, with hreflang

alternates for English, French and Spanish.

MCP server

https://duskly.ai/mcp speaks the Model Context Protocol over Streamable HTTP, stateless JSON. No key, no account, no session.

JSON
{"mcpServers": {"duskly": {"type": "http", "url": "https://duskly.ai/mcp"}}}

Setup instructions for Claude, Claude Code, Codex and ChatGPT are on the MCP server page.

Free, no listing needed:

  • duskly_classify_edit: is this edit disclosable, ambiguous, or prohibited outright
  • duskly_generate_disclosure: the MLS wording for every publishing surface
  • duskly_list_prohibited_alterations: what no disclosure can cure
  • duskly_list_edits: the available edits and their compliance status
  • duskly_verify_image: check an image for provenance marks
  • duskly_get_pricing: what it costs and what a purchase includes
  • duskly_start_listing: a link for a person to upload photos

For a listing, passing its id from the listing URL:

  • duskly_get_listing: photos, what has been edited, whether it is paid, budget left
  • duskly_get_listing_pack: paid listings only: download link, per-photo disclosure wording, originals page
  • duskly_get_checkout_url: a Stripe URL for a person to open and pay

Possession of the listing id is the authorisation, as it is on the website. A paid listing is fully readable through MCP; an unpaid one returns the checkout URL instead. No tool completes a purchase.

There is no render tool, deliberately. A render spends model credit and sits behind a browser check an automated client cannot pass, so the server hands back a link for a person to open rather than pretending it can do the work. Duskly does not take payment through MCP either: when the keyed tier lands, checkout returns a Stripe URL for a human to open.

GET and DELETE return 405. There is no SSE stream because the server sends no server-initiated messages, and no session to delete because it issues none.

Markdown instead of HTML

The home page and each tool page can be fetched as Markdown by sending Accept: text/markdown. Responses carry Content-Type: text/markdown and Vary: Accept. Other pages, and paths that do not exist, answer with their normal HTML and status rather than a Markdown error.

Terminal
curl -H 'Accept: text/markdown' https://duskly.ai/

Verifying an image

Terminal
curl -X POST https://duskly.ai/api/v1/verify -F image=@photo.jpg

Returns what provenance marks were found: an invisible Duskly watermark, IPTC digital source type, and whether a C2PA container appears present.

Read the result carefully before repeating it. It is a limited inspection report, not a certificate of authenticity or compliance. The absence of a mark is not evidence that an image is a camera capture: most AI editors write nothing at all, and Duskly's own paid downloads are deliberately unmarked. The C2PA field reports only that a container appears present; manifests are not parsed, signatures are not validated, and Duskly does not sign them.

Versioning

Integrate against /api/v1/verify. Breaking changes ship as a new path segment, never in place. /api/verify is an unversioned alias kept because links to it are already published, and is not covered by that promise.

A retiring version is announced with Deprecation and Sunset headers (RFC 8594) at least six months before removal.

Rate limits

No key means the limit is counted per IP. Callers without a browser bot-check token get a smaller hourly allowance than the website does. Every response carries RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset and RateLimit-Policy; a 429 adds Retry-After. Throttle on those rather than retrying into a refusal.

Errors

Every 4xx and 5xx is JSON with a stable machine-readable code, a human-readable error, and usually a detail saying how to resolve it.

JSON
{"error": "Image is larger than 20MB", "code": "image_too_large", "detail": "The limit is 20MB per image."}

Codes: image_missing, image_too_large, image_unreadable, bot_check_failed, rate_limited, unavailable, not_found.

What there is no API for

Editing photos. The render endpoints spend model credit and require a browser bot check, so they are not callable by automated clients. Listing URLs are purchase credentials and are excluded in robots.txt; do not crawl, index or share them.

Questions: contact@duskly.ai.

Duskly

Instant AI edits for listing photos, returned with the unaltered original and the disclosure text for your MLS.

Herramientas

  • De día a atardecer
  • Staging virtual
  • Eliminación de objetos
  • De ocupado a vacío
  • Reemplazo de cielo
  • Renovación virtual

Producto

  • Abrir el editor
  • Verificar una imagen
  • Precios
  • Desarrolladores
  • Servidor MCP
  • Comparar
  • Herramientas gratuitas
  • Requisitos de fotos de los MLS
  • AB 723 y fotos de anuncios
  • ¿Se permite el efecto de día a atardecer en el MLS?
  • Todas las guías

Legal

  • Acerca de
  • Contacto
  • Privacidad
  • Términos

© 2026 Duskly

support@duskly.aiSample photo credits and image licences