create-signup-request
dci create-signup-request [body]
Starts a Cloud Intelligence trial signup for the organization owning the email domain. Idempotent per Idempotency-Key: a retried create returns the same request. Nothing is provisioned until the admin verifies the request. Human channels (console, web) additionally require a Cloudflare Turnstile token and an accepted Terms of Service version; the emailed 6-digit verification code is then the consent act. Agents should present consentUrl to the organization's admin and poll getSignupRequest. Existing accounts, customer domains and previous trials receive the same pending response as new organizations. Eligibility is evaluated after mailbox verification or authenticated human consent.
Pass the request body as name: value arguments or pipe JSON on stdin — see Command structure.
email (the organization admin's work email; free-mail and disposable addresses are rejected) and
companyName are required, and so is --idempotency-key (1 to 256 characters). Retrying with the
same key returns the same request instead of creating a second one. No authentication is needed.
Nothing is provisioned until the admin verifies the request. Present the returned consentUrl to the
organization's admin, or enter the emailed code yourself with dci verify-signup-request, and poll
dci get-signup-request until the request is completed. The human channels (console, web) also
require a turnstileToken and termsConsent{version, accepted}; the default agent channel does not.
Conflicts return 409: the email or domain is already registered (the response carries signInUrl), a
signup is already pending for it (the response carries signupRequestId), or the trial was already used.
Examples
# Start a trial signup for the organization that owns the admin's work email domain.
dci create-signup-request --idempotency-key "$(uuidgen)" email: [email protected], companyName: "Example Corp"
Returns the signup request with its `id` (sr_ prefix), `status: pending_consent` and a `consentUrl`. The admin receives a 6-digit verification code by email.
# Identify the calling agent for attribution.
dci create-signup-request --idempotency-key <request-key> email: [email protected], companyName: "Example Corp", source{channel: agent, agentClient: "my-agent 1.0"}
# Create it from a JSON file, and capture the request ID for the follow-up calls.
dci create-signup-request --idempotency-key <request-key> --output json < signup.json | jq -r .id
# signup.json
{"email": "[email protected]", "companyName": "Example Corp"}
Request
Content-Type: application/json
| Field | Type | Required | Description |
|---|---|---|---|
email | string (email) | yes | Work email of the organization's admin. Free-mail and disposable addresses are rejected. |
companyName | string | yes | |
source | object | Attribution. channel defaults to agent; console and web are the human channels. | |
source.channel | string | One of: "agent", "console", "web". Default: "agent". | |
source.agentClient | string | Name and version of the calling agent (agent channel). | |
source.campaign | string | ||
source.utmSource | string | ||
source.utmMedium | string | ||
source.utmCampaign | string | ||
turnstileToken | string | Cloudflare Turnstile response token. Required for the console and web channels. | |
termsConsent | object | Terms of Service acceptance. Required for the console and web channels. | |
termsConsent.version | string | yes | Terms version shown to the requester; must be a version the API currently accepts, otherwise terms_version_outdated. |
termsConsent.accepted | boolean | yes |
Raw JSON schema
{
"type": "object",
"required": [
"email",
"companyName"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"maxLength": 120,
"description": "Work email of the organization's admin. Free-mail and disposable addresses are rejected."
},
"companyName": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"source": {
"type": "object",
"description": "Attribution. channel defaults to agent; console and web are the human channels.",
"properties": {
"channel": {
"type": "string",
"enum": [
"agent",
"console",
"web"
],
"default": "agent"
},
"agentClient": {
"type": "string",
"maxLength": 120,
"description": "Name and version of the calling agent (agent channel)."
},
"campaign": {
"type": "string",
"maxLength": 120
},
"utmSource": {
"type": "string",
"maxLength": 120
},
"utmMedium": {
"type": "string",
"maxLength": 120
},
"utmCampaign": {
"type": "string",
"maxLength": 120
}
}
},
"turnstileToken": {
"type": "string",
"maxLength": 2048,
"description": "Cloudflare Turnstile response token. Required for the console and web channels."
},
"termsConsent": {
"type": "object",
"description": "Terms of Service acceptance. Required for the console and web channels.",
"required": [
"version",
"accepted"
],
"properties": {
"version": {
"type": "string",
"description": "Terms version shown to the requester; must be a version the API currently accepts, otherwise terms_version_outdated."
},
"accepted": {
"type": "boolean"
}
}
}
}
}
Output
OK - an earlier request with the same Idempotency-Key was returned.
By default dci renders the result as a table. Use --output json to get the full structure described below — see Output formats.
| Field | Type | Description |
|---|---|---|
id | string | Public request id (sr_ prefix); an unguessable capability. |
status | string | One of: "pending_consent", "consented", "provisioning", "completed", "rejected", "expired", "failed". |
channel | string | One of: "agent", "console", "web". |
companyName | string | Company name supplied at signup; shown on the console verification and completion pages. |
consentUrl | string (uri) | Page where the organization's admin verifies the request (pending_consent only). |
activationToken | string | Returned once, by the verifySignupRequest call that performed the verification. Redeem it with createSignupSession after the request is completed. |
resultToken | string | Returned only by successful verifySignupRequest. Send as Signup-Result-Token when polling this request to read its result. Valid for one hour; never returned by create, replay, resend or GET. |
verification | object | Present while the request awaits the emailed code. |
verification.required | boolean | |
verification.expiresAt | string (date-time) | |
verification.resendAfterSeconds | integer | |
verification.sendsRemaining | integer | |
expiresAt | string (date-time) | When an unverified request expires (pending_consent only). |
pollAfterSeconds | integer | Suggested polling interval while the request is not terminal. |
customerId | string | The provisioned tenant (completed only). |
consoleUrl | string (uri) | |
signInUrl | string (uri) | Page where the admin signs into the new tenant (completed only). |
tier | string | Trial tier name (trial). |
trialEndDate | string (date-time) | |
nextSteps | array of string | |
reason | object | Why a terminal request did not complete. |
reason.code | string | |
reason.detail | string | |
reason.retryable | boolean |
Raw JSON schema
{
"type": "object",
"description": "Redacted public view of a signup request. Never includes the admin email, the verification code or the idempotency key.",
"required": [
"id",
"status"
],
"properties": {
"id": {
"type": "string",
"description": "Public request id (sr_ prefix); an unguessable capability."
},
"status": {
"type": "string",
"enum": [
"pending_consent",
"consented",
"provisioning",
"completed",
"rejected",
"expired",
"failed"
]
},
"channel": {
"type": "string",
"enum": [
"agent",
"console",
"web"
]
},
"companyName": {
"type": "string",
"description": "Company name supplied at signup; shown on the console verification and completion pages."
},
"consentUrl": {
"type": "string",
"format": "uri",
"description": "Page where the organization's admin verifies the request (pending_consent only)."
},
"activationToken": {
"type": "string",
"description": "Returned once, by the verifySignupRequest call that performed the verification. Redeem it with createSignupSession after the request is completed."
},
"resultToken": {
"type": "string",
"description": "Returned only by successful verifySignupRequest. Send as Signup-Result-Token when polling this request to read its result. Valid for one hour; never returned by create, replay, resend or GET."
},
"verification": {
"type": "object",
"description": "Present while the request awaits the emailed code.",
"properties": {
"required": {
"type": "boolean"
},
"expiresAt": {
"type": "string",
"format": "date-time"
},
"resendAfterSeconds": {
"type": "integer"
},
"sendsRemaining": {
"type": "integer"
}
}
},
"expiresAt": {
"type": "string",
"format": "date-time",
"description": "When an unverified request expires (pending_consent only)."
},
"pollAfterSeconds": {
"type": "integer",
"description": "Suggested polling interval while the request is not terminal."
},
"customerId": {
"type": "string",
"description": "The provisioned tenant (completed only)."
},
"consoleUrl": {
"type": "string",
"format": "uri"
},
"signInUrl": {
"type": "string",
"format": "uri",
"description": "Page where the admin signs into the new tenant (completed only)."
},
"tier": {
"type": "string",
"description": "Trial tier name (trial)."
},
"trialEndDate": {
"type": "string",
"format": "date-time"
},
"nextSteps": {
"type": "array",
"items": {
"type": "string"
}
},
"reason": {
"type": "object",
"description": "Why a terminal request did not complete.",
"properties": {
"code": {
"type": "string"
},
"detail": {
"type": "string"
},
"retryable": {
"type": "boolean"
}
}
}
}
}
Errors
On failure, dci prints a single error message — with a hint when one is available — and exits with a typed code your scripts can branch on. See Errors and exit codes for the full contract.
HTTP status to exit code mapping
| HTTP status | Exit code | Error code | Meaning |
|---|---|---|---|
| 400 | 30 | VALIDATION_ERROR | The arguments or request body were rejected. Review the command's flags and payload. |
| 403 | 11 | PERMISSION_DENIED | The DoiT user or the active customer context does not have access. |
| 429 | 50 | RATE_LIMITED | Too many requests. Retryable — the CLI reports the server-provided delay. |
| 503 | 40 | API_SERVER_ERROR | The API failed to process the request. Retryable; contact DoiT support if it persists. |
Related
- verify-signup-request — Verify a signup request with the emailed code
- get-signup-request — Get a signup request
- resend-signup-verification — Resend the verification code
- create-signup-session — Sign the verified prospect in
- API reference: POST /signup/v1/requests
Aliases: createsignuprequest