publish-an-openai-app · version 1.0.0 · for sellers.
When to use
- A seller admin asks what is ready for a ChatGPT app built on their storefront.
- The person needs the CNAME for their public listing domain, or has a domain-ownership token from OpenAI to publish.
- The person wants a checklist for the OpenAI submission form.
Before you start
- You are connected to the Seller account the person means to publish, and
get_statusshows an admin role. The listing-domain and token tools refuse anyone else. - The storefront is listed on the marketplace. Public distribution also needs the Distribution package; the Listing page says whether the account has it. See Listing.
Steps
- Call
get_status. If the active account is not the intended Seller account, or the person is not an admin, stop and say which account or role is needed. - Call
open_pagewithpage: "listing". Its result is the authority for the state you report:publicDistribution(hostname,status, thednsRecordto add,checkedAt,error,public) andchatgpt(theprojectionOpenAI will see and thechallengewith itstoken,urlandstatus). - If the listing is not on the marketplace yet, call
publish_discoverywithvisibility: "marketplace"after the person confirms. - Public listing domain. If
publicDistribution.hostnameis empty, ask the person for a hostname on their own domain and callsave_discovery_hostnamewith it. Replacing a saved hostname needsconfirmReplace: true. Give the person the exact CNAME from the result; never guess DNS values. - After the person has added the record at their DNS provider, call
activate_discovery_hostname. Onlystatus: "active"means Semicola verified the routing. Anything else is not ready: report the returnederrorand stop until the person fixes DNS. - Call
publish_discoverywithvisibility: "public"so the listing is served on that domain. - When OpenAI gives the person a domain-ownership token, ask them to paste it, confirm the exact
value back, and call
update_discovery_openai_challengewithtoken. Replacing or removing a saved token (token: null) needs the person’s explicit confirmation. - Call
probe_discovery_openai_challengeand report thechallenge.status:okmeans the address returns the exact token,mismatchorunreachablemeans it does not. This does not mean OpenAI has verified the domain; OpenAI checks on its own timeline. - Walk the person through the parts of the OpenAI form that only they can complete: publisher
identity and a monitored contact, app name and descriptions (compare with
chatgpt.projection), website, support, privacy and terms URLs, logos and screenshots, starter prompts, supported locales and countries, the production MCP URL, reviewer access, tool justifications and test cases, policy answers, release notes and the review video. Ask the person to confirm each in the portal; never mark one complete yourself. - Finish with a short checklist in three groups: ready in Semicola (from the Listing result), missing in Semicola, and manual in OpenAI. Name the next action and who owns it.
Guardrails
- Never publish, submit or approve an OpenAI app for the person, and never say an app is submitted, reviewed or live in ChatGPT.
- Never invent DNS records, portal values, locales or completion state.
- Never ask for, repeat or store reviewer credentials or OAuth tokens. The domain-ownership token is the only secret-looking value this skill handles, and only because the person pastes it to publish.
- Semicola does not generate an OpenAI submission package, app icons or a reviewer login yet. Say so when the person asks for them, and do not stand in for them with made-up files.
- Do not use other seller writes (for example
save_seller) to work around a Listing state you cannot change. - Stop at
needs_inputandpending_confirmation, as in every skill.
Done when
publicDistribution.statusisactiveand the listing is public, or the person knows the one DNS step blocking it.- If the person has a token,
challenge.statusisok. - The person has the three-group checklist and knows the submission itself is theirs to make in OpenAI’s portal.