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.
Pass the request body as name: value arguments or pipe JSON on stdin — see Command structure.
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 match the current version. |
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 match the current version."
},
"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). |
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)."
},
"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. |
| 409 | 21 | RESOURCE_CONFLICT | The operation conflicts with the resource's current state. |
| 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
- get-signup-request — Get a signup request
- resend-signup-verification — Resend the verification code
- verify-signup-request — Verify a signup request with the emailed code
- API reference: POST /signup/v1/requests
Aliases: createsignuprequest