ESF · Developer guide
Publish your service or code as a skill
Start guided publishing with an AI model and instructions. For developer publishing, connect your HTTPS API or Node.js/Python code and define input and result fields. Save a draft, run a real test, then submit for review.
Connect your own service or package, define its input and result fields, then save, test and submit it for review. Start with a downloadable example below.
Bring your service
Use a public DNS hostname with HTTPS on port 443. Local/private IPs, URL credentials and redirects are not supported. ESF sends a POST request and expects result JSON. The buyer’s browser never receives your connection token.
After saving, run a server test to verify connectivity. If it fails, check public DNS, the HTTPS certificate, port 443 and server access rules. Private addresses and redirects are refused.
- Enter the API URL and choose no authentication or a Bearer token. Put tokens in the dedicated secret field, not in URLs or instructions.
- Provide the input processor’s name and an actual privacy notice URL. Buyers see this information before sending input.
- Save the input/output schemas and test with synthetic data. Calls to your own API can still trigger external work or costs.
API request and response:
POST /skill
Content-Type: application/json
Authorization: Bearer <your dedicated connection token>
{"input":{"prompt":"Summarize these test notes."},"context":{"requestId":"<request UUID>"}}
HTTP 200
{"text":"A structured result matching the output schema."}Ensure that receiving the same context.requestId again does not duplicate external work. The echo example has no side effects; it does not supply a deduplication store for payments, emails or data changes.
Download the Node.js API server example. This local example requires your own HTTPS deployment and a dedicated environment token; it does not deploy a server for you.
curl --request POST 'https://YOUR_OWN_DOMAIN/skill' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_ENDPOINT_TOKEN' \
--data '{"input":{"prompt":"Test notes"},"context":{"requestId":"REPLACE_WITH_UUID"}}'The address and token above are placeholders. Do not share commands containing real secrets or leave them in shell history. Endpoint URLs and tokens are private creator settings; only processor information is public.
Hosted packages
ZIPs are limited to 5 MB, 20 MB after extraction and 200 files. Entrypoints are relative to the ZIP root. Use Node.js 24 or Python’s standard library; npm/pip installation is not available. Bundle any pure JavaScript dependencies.
Read input JSON from ESF_INPUT_PATH and write result JSON to ESF_OUTPUT_PATH. Logs are not output results. Execution is limited to 5–120 seconds. Uploads are immutable and SHA-256 identifies a code version.
- Node.js main.mjs — an echo example using only file input/output
- Python main.py — the same example without external packages or keys
For example, place the downloaded main.mjs in a new working folder and compress it with PowerShell.
Compress-Archive -LiteralPath .\main.mjs -DestinationPath .\skill.zipDo not include .env, keys, authentication files or personal information in packages. Hosted secret injection is unavailable. Keep provider keys on your own server and use HTTPS API mode. Hosted code cannot use ESF model keys.
Hosted code does not currently support external API calls. Leave the external origins list empty. Deploy programs requiring an external service or provider key on your own server and register an HTTPS API.
Schemas
Input must be a JSON object. Simple fields support strings, numbers, integers and booleans. Advanced schemas allow up to four nested levels, 20 properties per object and 100 items per array. This is a subset of JSON Schema; remote references such as $ref are not supported.
Set additionalProperties: false on each object and list mandatory keys in required. Input is limited to 32 KB and output to 1 MB. Results must pass the output schema. Keep secrets and internal operational details out of buyer-facing field titles and descriptions.
Dedicated sessions
Hosted packages can provide a dedicated web interface. Set its entrypoint, internal port (4100–4999) and opening path. Listen on 0.0.0.0:ESF_PORT and prefix links and asset paths with ESF_BASE_PATH . This does not expose a public port or share the creator’s development environment. Each HTTPS session is checked against the buyer’s access, run and release.
The browser uses a restricted iframe without ESF login cookies, API keys or same-origin privileges. Apps relying on popups, top-level navigation or normal browser storage may not work. Sessions last at most 10 minutes and do not renew automatically.
The ESF parent page restricts the frame from navigating beyond the designated runtime. Use the dedicated screen inside ESF and do not share its session URL. Top-level browser navigation to the session is refused.
The standalone web examples are temporary notepads with no network calls or saved results. Contents disappear when the screen closes. Include both main and web entrypoints in the ZIP and select example port 4100.
Ready-to-upload echo examples: Node.js ZIP · Python ZIP · File sizes and SHA-256. These ZIPs return input as JSON and expose the same-session HTTP result through the “Read result” button. They use no external service or secret.
The ZIP’s esf.json must match the saved settings. For Node.js select main.mjs·web.mjs; for Python select main.py·web.py. Enable the dedicated web screen for both examples, with port 4100, opening path / and no external origins. Keep the default schemas and test with {"prompt":"Hello"}. Downloads are code and configuration examples; they do not establish server readiness or review approval.
Release process
- Save a draft. Uploading code and saving settings do not establish execution readiness.
- Check your synthetic input and the declared external processing, then request a real server test. A disconnected runtime is reported as unavailable.
- Review the successful result and its schema, then submit for review. Automated review does not guarantee program quality or safety.
- Test a new version after changing settings. Active runs keep their original release. Versioning an API configuration does not freeze the code on that external server.
After a timeout or lost response, check run history and the external service before creating a new run. Retrying the same request prevents duplicate admission, but the external service must implement its own deduplication.
Responsibilities
Connection tokens are encrypted in storage, but authorized ESF servers decrypt them when calling your service. Removing a stored token does not revoke it at the provider or cancel accepted work. Ordinary read screens do not return the original token.
Buyer input is shared with the creator’s server or code and the declared processing services. Creators may see input in their server or provider logs. Hiding other buyers’ runs in ESF does not prevent external processors from accessing the data they receive.
Access prices and external API charges are separate. ESF preview hosting is provided within limits; your own tests may perform paid work. Providers bill your account. ESF does not guarantee provider spending caps or unlimited hosting. Work already performed may incur charges after failure, cancellation or retry.