Find-or-create a project by domain
Find-or-creates a project keyed by (owner_email, domain) under the session's owner, and returns it. Idempotent: a second call with the same domain returns…
Find-or-creates a project keyed by (owner_email, domain) under the session's owner, and returns it. Idempotent: a second call with the same domain returns the existing project with created: false.
Only domain is required — name defaults to the domain on first create. Recording the result in a local .shipeasy binding is a consumer side-effect; this endpoint never performs it.
- Install flow — provision a per-app project without a trip to the dashboard. Run it on every install; the idempotent key means a re-run returns the existing project rather than duplicating it.
- Name explicitly — pass
nameto label the project distinctly from itsdomain.
Authorization
bearerSdkKey Pass an admin SDK key as Authorization: Bearer sdk_admin_…. Mint via POST /api/admin/keys with type: "admin".
In: header
Header Parameters
Project the request operates on. Optional — defaults to the project the SDK key belongs to; pass it only to scope a multi-project key (the generated client sets it once from its configuration, so per-call callers never thread it).
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://shipeasy.ai/api/admin/projects/upsert" \ -H "Content-Type: application/json" \ -d '{ "domain": "acme.com" }'{
"id": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
"name": "Acme",
"domain": "acme.com",
"owner_email": "owner@acme.com",
"created": true
}{
"error": "Malformed request (bad JSON, missing project scope).",
"code": "BAD_REQUEST"
}{
"error": "Missing or invalid admin SDK key.",
"code": "UNAUTHORIZED"
}{
"error": "Key is valid but not allowed to act on this project.",
"code": "FORBIDDEN"
}{
"error": "The resource does not exist or is not visible to the caller.",
"code": "NOT_FOUND"
}{
"error": "A resource with this name already exists in the project.",
"code": "ALREADY_EXISTS"
}{
"error": "The request body failed structural (schema) validation.",
"code": "VALIDATION"
}