Skip to content

Edit an answer during review

PATCH
/v1/assessments/{id}/questions/{questionId}
curl --request PATCH \
--url https://api.tradecrafthub.ai/v1/assessments/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/questions/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "humanAnswer": "example", "reviewerComment": "example", "approverComment": "example", "flaggedForApprover": true, "isCanonicalFlag": true }'

Any of humanAnswer, reviewerComment, approverComment, flaggedForApprover, isCanonicalFlag. Reviewer and up.

Scope questions:write (Edit answers in review; lowest role reviewer). Effective access is the token’s scopes ∩ the caller’s current role.

id
required
string format: uuid

Assessment id

questionId
required
string format: uuid

Question id

X-Request-Id
string

Your correlation id (8–128 of A–Z a–z 0–9 . _ : -); echoed back

Media typeapplication/json
object
humanAnswer
string
reviewerComment
string
approverComment
string
flaggedForApprover
boolean
isCanonicalFlag
boolean

Example generated

{
"humanAnswer": "example",
"reviewerComment": "example",
"approverComment": "example",
"flaggedForApprover": true,
"isCanonicalFlag": true
}

The question

Media typeapplication/json
object
data
required
object
id
required
string format: uuid
index
required

Order in the questionnaire

integer
section
Any of:
string
question
required
string
answer
Any of:
string
provenance
Any of:

How the answer was produced. Extensible: new values may be added — tolerate unknown ones.

string
Allowed values: ai_generated human_edited human_answered reference
status
required
string
confidenceScore
Any of:
number
citations

Sources the answer cites (empty when the plan does not include citations)

Array
flagged
boolean
flaggedForApprover
boolean
reviewerComment
Any of:
string
approverComment
Any of:
string
updatedAt
required
string format: date-time

Example

{
"data": {
"provenance": "ai_generated"
}
}
X-Request-Id
string

Echoes a valid X-Request-Id, else generated

RateLimit-Limit
integer

Requests allowed in the tightest window

RateLimit-Remaining
integer

Requests left

RateLimit-Reset
integer

Seconds until the window resets

  • VALIDATION_ERROR — The request body, query or path is invalid.

Also a token in the URL (the token is revoked), a missing Idempotency-Key where required, a cursor from another organization or filter set.

Media typeapplication/json
object
error
required
object
code
required

The error-code catalogue: VALIDATION_ERROR 400, UNAUTHENTICATED 401, SPEND_CAP_EXCEEDED 402, TENANT_AI_BUDGET_EXCEEDED 402, FORBIDDEN 403, NOT_FOUND 404, CONFLICT 409, GONE 410, ENDPOINT_REMOVED 410, PAYLOAD_TOO_LARGE 413, UNSUPPORTED_MEDIA_TYPE 415, RATE_LIMITED 429, INTERNAL 500, PROVIDER_ERROR 502, SERVICE_UNAVAILABLE 503, WEAK_PASSWORD 400, INVALID_TOKEN 400, EXPIRED_TOKEN 400, INVALID_CREDENTIALS 401, INVALID_CODE 401, SSO_REQUIRED 403, SLUG_TAKEN 409, LAST_ADMIN 409, MANAGED_BY_IDP 409, LOCKED 429, ASSET_KIND_NOT_ALLOWED 400, ASSET_SOURCE_NOT_ALLOWED 400, LIBRARY_ARCHIVED 409, MISSING_SCOPES 400, CLASSIC_TOKEN 400, INVALID_CREDENTIAL 400, CLOUD_ID_UNRESOLVED 400, SITE_NOT_FOUND 400, INTEGRATION_AUTH 409, INTEGRATION_NOT_CONNECTED 409, SITE_CHOICE_EXPIRED 409, PLATFORM_NOT_CONFIGURED 503, PLAN_LIMIT_REACHED 403, PLAN_FEATURE_UNAVAILABLE 403, TRIAL_EXPIRED 403, INSUFFICIENT_SCOPE 403, API_DISABLED 403, IDEMPOTENCY_CONFLICT 409. Extensible.

string
Allowed values: VALIDATION_ERROR UNAUTHENTICATED SPEND_CAP_EXCEEDED TENANT_AI_BUDGET_EXCEEDED FORBIDDEN NOT_FOUND CONFLICT GONE ENDPOINT_REMOVED PAYLOAD_TOO_LARGE UNSUPPORTED_MEDIA_TYPE RATE_LIMITED INTERNAL PROVIDER_ERROR SERVICE_UNAVAILABLE WEAK_PASSWORD INVALID_TOKEN EXPIRED_TOKEN INVALID_CREDENTIALS INVALID_CODE SSO_REQUIRED SLUG_TAKEN LAST_ADMIN MANAGED_BY_IDP LOCKED ASSET_KIND_NOT_ALLOWED ASSET_SOURCE_NOT_ALLOWED LIBRARY_ARCHIVED MISSING_SCOPES CLASSIC_TOKEN INVALID_CREDENTIAL CLOUD_ID_UNRESOLVED SITE_NOT_FOUND INTEGRATION_AUTH INTEGRATION_NOT_CONNECTED SITE_CHOICE_EXPIRED PLATFORM_NOT_CONFIGURED PLAN_LIMIT_REACHED PLAN_FEATURE_UNAVAILABLE TRIAL_EXPIRED INSUFFICIENT_SCOPE API_DISABLED IDEMPOTENCY_CONFLICT
message
required

Human-readable message

string
scope

INSUFFICIENT_SCOPE: the scope the operation needs

string
reason

FORBIDDEN: why (member_inactive, permission_missing, not_opted_in, user_only, role, …)

string
error
required
object
code
string
Allowed values: VALIDATION_ERROR

Examples

ExampleVALIDATION_ERROR

The request body, query or path is invalid.

{
"error": {
"code": "VALIDATION_ERROR",
"message": "limit must be between 1 and 100"
}
}
  • UNAUTHENTICATED — No valid session, API key or bearer token.

Missing, unknown, expired or revoked token, or a token for another resource (WWW-Authenticate: Bearer … names the resource metadata).

Media typeapplication/json
object
error
required
object
code
required

The error-code catalogue: VALIDATION_ERROR 400, UNAUTHENTICATED 401, SPEND_CAP_EXCEEDED 402, TENANT_AI_BUDGET_EXCEEDED 402, FORBIDDEN 403, NOT_FOUND 404, CONFLICT 409, GONE 410, ENDPOINT_REMOVED 410, PAYLOAD_TOO_LARGE 413, UNSUPPORTED_MEDIA_TYPE 415, RATE_LIMITED 429, INTERNAL 500, PROVIDER_ERROR 502, SERVICE_UNAVAILABLE 503, WEAK_PASSWORD 400, INVALID_TOKEN 400, EXPIRED_TOKEN 400, INVALID_CREDENTIALS 401, INVALID_CODE 401, SSO_REQUIRED 403, SLUG_TAKEN 409, LAST_ADMIN 409, MANAGED_BY_IDP 409, LOCKED 429, ASSET_KIND_NOT_ALLOWED 400, ASSET_SOURCE_NOT_ALLOWED 400, LIBRARY_ARCHIVED 409, MISSING_SCOPES 400, CLASSIC_TOKEN 400, INVALID_CREDENTIAL 400, CLOUD_ID_UNRESOLVED 400, SITE_NOT_FOUND 400, INTEGRATION_AUTH 409, INTEGRATION_NOT_CONNECTED 409, SITE_CHOICE_EXPIRED 409, PLATFORM_NOT_CONFIGURED 503, PLAN_LIMIT_REACHED 403, PLAN_FEATURE_UNAVAILABLE 403, TRIAL_EXPIRED 403, INSUFFICIENT_SCOPE 403, API_DISABLED 403, IDEMPOTENCY_CONFLICT 409. Extensible.

string
Allowed values: VALIDATION_ERROR UNAUTHENTICATED SPEND_CAP_EXCEEDED TENANT_AI_BUDGET_EXCEEDED FORBIDDEN NOT_FOUND CONFLICT GONE ENDPOINT_REMOVED PAYLOAD_TOO_LARGE UNSUPPORTED_MEDIA_TYPE RATE_LIMITED INTERNAL PROVIDER_ERROR SERVICE_UNAVAILABLE WEAK_PASSWORD INVALID_TOKEN EXPIRED_TOKEN INVALID_CREDENTIALS INVALID_CODE SSO_REQUIRED SLUG_TAKEN LAST_ADMIN MANAGED_BY_IDP LOCKED ASSET_KIND_NOT_ALLOWED ASSET_SOURCE_NOT_ALLOWED LIBRARY_ARCHIVED MISSING_SCOPES CLASSIC_TOKEN INVALID_CREDENTIAL CLOUD_ID_UNRESOLVED SITE_NOT_FOUND INTEGRATION_AUTH INTEGRATION_NOT_CONNECTED SITE_CHOICE_EXPIRED PLATFORM_NOT_CONFIGURED PLAN_LIMIT_REACHED PLAN_FEATURE_UNAVAILABLE TRIAL_EXPIRED INSUFFICIENT_SCOPE API_DISABLED IDEMPOTENCY_CONFLICT
message
required

Human-readable message

string
scope

INSUFFICIENT_SCOPE: the scope the operation needs

string
reason

FORBIDDEN: why (member_inactive, permission_missing, not_opted_in, user_only, role, …)

string
error
required
object
code
string
Allowed values: UNAUTHENTICATED

Examples

ExampleUNAUTHENTICATED

No valid session, API key or bearer token.

{
"error": {
"code": "UNAUTHENTICATED",
"message": "The access token is invalid, expired or revoked"
}
}
  • FORBIDDEN — Authenticated, but the role, object grant or policy does not allow this.
  • INSUFFICIENT_SCOPE — The access token lacks the scope this operation needs (error.scope names it; WWW-Authenticate: Bearer error=“insufficient_scope”).
  • API_DISABLED — The organization has turned the API off (Admin → API → Settings); its clients and grants are kept.
  • PLAN_FEATURE_UNAVAILABLE — The organization’s plan does not include this feature (error.feature, plan).
  • TRIAL_EXPIRED — The trial ended (or the subscription was cancelled); the organization is read-only (error.trialEndedAt).
Media typeapplication/json
object
error
required
object
code
required

The error-code catalogue: VALIDATION_ERROR 400, UNAUTHENTICATED 401, SPEND_CAP_EXCEEDED 402, TENANT_AI_BUDGET_EXCEEDED 402, FORBIDDEN 403, NOT_FOUND 404, CONFLICT 409, GONE 410, ENDPOINT_REMOVED 410, PAYLOAD_TOO_LARGE 413, UNSUPPORTED_MEDIA_TYPE 415, RATE_LIMITED 429, INTERNAL 500, PROVIDER_ERROR 502, SERVICE_UNAVAILABLE 503, WEAK_PASSWORD 400, INVALID_TOKEN 400, EXPIRED_TOKEN 400, INVALID_CREDENTIALS 401, INVALID_CODE 401, SSO_REQUIRED 403, SLUG_TAKEN 409, LAST_ADMIN 409, MANAGED_BY_IDP 409, LOCKED 429, ASSET_KIND_NOT_ALLOWED 400, ASSET_SOURCE_NOT_ALLOWED 400, LIBRARY_ARCHIVED 409, MISSING_SCOPES 400, CLASSIC_TOKEN 400, INVALID_CREDENTIAL 400, CLOUD_ID_UNRESOLVED 400, SITE_NOT_FOUND 400, INTEGRATION_AUTH 409, INTEGRATION_NOT_CONNECTED 409, SITE_CHOICE_EXPIRED 409, PLATFORM_NOT_CONFIGURED 503, PLAN_LIMIT_REACHED 403, PLAN_FEATURE_UNAVAILABLE 403, TRIAL_EXPIRED 403, INSUFFICIENT_SCOPE 403, API_DISABLED 403, IDEMPOTENCY_CONFLICT 409. Extensible.

string
Allowed values: VALIDATION_ERROR UNAUTHENTICATED SPEND_CAP_EXCEEDED TENANT_AI_BUDGET_EXCEEDED FORBIDDEN NOT_FOUND CONFLICT GONE ENDPOINT_REMOVED PAYLOAD_TOO_LARGE UNSUPPORTED_MEDIA_TYPE RATE_LIMITED INTERNAL PROVIDER_ERROR SERVICE_UNAVAILABLE WEAK_PASSWORD INVALID_TOKEN EXPIRED_TOKEN INVALID_CREDENTIALS INVALID_CODE SSO_REQUIRED SLUG_TAKEN LAST_ADMIN MANAGED_BY_IDP LOCKED ASSET_KIND_NOT_ALLOWED ASSET_SOURCE_NOT_ALLOWED LIBRARY_ARCHIVED MISSING_SCOPES CLASSIC_TOKEN INVALID_CREDENTIAL CLOUD_ID_UNRESOLVED SITE_NOT_FOUND INTEGRATION_AUTH INTEGRATION_NOT_CONNECTED SITE_CHOICE_EXPIRED PLATFORM_NOT_CONFIGURED PLAN_LIMIT_REACHED PLAN_FEATURE_UNAVAILABLE TRIAL_EXPIRED INSUFFICIENT_SCOPE API_DISABLED IDEMPOTENCY_CONFLICT
message
required

Human-readable message

string
scope

INSUFFICIENT_SCOPE: the scope the operation needs

string
reason

FORBIDDEN: why (member_inactive, permission_missing, not_opted_in, user_only, role, …)

string
error
required
object
code
string
Allowed values: FORBIDDEN INSUFFICIENT_SCOPE API_DISABLED PLAN_FEATURE_UNAVAILABLE TRIAL_EXPIRED

Examples

Authenticated, but the role, object grant or policy does not allow this.

{
"error": {
"code": "FORBIDDEN",
"message": "Your current role can't do this",
"reason": "role"
}
}
  • NOT_FOUND — No such resource in this organization (unknown, malformed or other-tenant id).

Unknown, malformed or another organization’s id.

Media typeapplication/json
object
error
required
object
code
required

The error-code catalogue: VALIDATION_ERROR 400, UNAUTHENTICATED 401, SPEND_CAP_EXCEEDED 402, TENANT_AI_BUDGET_EXCEEDED 402, FORBIDDEN 403, NOT_FOUND 404, CONFLICT 409, GONE 410, ENDPOINT_REMOVED 410, PAYLOAD_TOO_LARGE 413, UNSUPPORTED_MEDIA_TYPE 415, RATE_LIMITED 429, INTERNAL 500, PROVIDER_ERROR 502, SERVICE_UNAVAILABLE 503, WEAK_PASSWORD 400, INVALID_TOKEN 400, EXPIRED_TOKEN 400, INVALID_CREDENTIALS 401, INVALID_CODE 401, SSO_REQUIRED 403, SLUG_TAKEN 409, LAST_ADMIN 409, MANAGED_BY_IDP 409, LOCKED 429, ASSET_KIND_NOT_ALLOWED 400, ASSET_SOURCE_NOT_ALLOWED 400, LIBRARY_ARCHIVED 409, MISSING_SCOPES 400, CLASSIC_TOKEN 400, INVALID_CREDENTIAL 400, CLOUD_ID_UNRESOLVED 400, SITE_NOT_FOUND 400, INTEGRATION_AUTH 409, INTEGRATION_NOT_CONNECTED 409, SITE_CHOICE_EXPIRED 409, PLATFORM_NOT_CONFIGURED 503, PLAN_LIMIT_REACHED 403, PLAN_FEATURE_UNAVAILABLE 403, TRIAL_EXPIRED 403, INSUFFICIENT_SCOPE 403, API_DISABLED 403, IDEMPOTENCY_CONFLICT 409. Extensible.

string
Allowed values: VALIDATION_ERROR UNAUTHENTICATED SPEND_CAP_EXCEEDED TENANT_AI_BUDGET_EXCEEDED FORBIDDEN NOT_FOUND CONFLICT GONE ENDPOINT_REMOVED PAYLOAD_TOO_LARGE UNSUPPORTED_MEDIA_TYPE RATE_LIMITED INTERNAL PROVIDER_ERROR SERVICE_UNAVAILABLE WEAK_PASSWORD INVALID_TOKEN EXPIRED_TOKEN INVALID_CREDENTIALS INVALID_CODE SSO_REQUIRED SLUG_TAKEN LAST_ADMIN MANAGED_BY_IDP LOCKED ASSET_KIND_NOT_ALLOWED ASSET_SOURCE_NOT_ALLOWED LIBRARY_ARCHIVED MISSING_SCOPES CLASSIC_TOKEN INVALID_CREDENTIAL CLOUD_ID_UNRESOLVED SITE_NOT_FOUND INTEGRATION_AUTH INTEGRATION_NOT_CONNECTED SITE_CHOICE_EXPIRED PLATFORM_NOT_CONFIGURED PLAN_LIMIT_REACHED PLAN_FEATURE_UNAVAILABLE TRIAL_EXPIRED INSUFFICIENT_SCOPE API_DISABLED IDEMPOTENCY_CONFLICT
message
required

Human-readable message

string
scope

INSUFFICIENT_SCOPE: the scope the operation needs

string
reason

FORBIDDEN: why (member_inactive, permission_missing, not_opted_in, user_only, role, …)

string
error
required
object
code
string
Allowed values: NOT_FOUND

Examples

ExampleNOT_FOUND

No such resource in this organization (unknown, malformed or other-tenant id).

{
"error": {
"code": "NOT_FOUND",
"message": "Not found"
}
}
  • CONFLICT — The resource’s state does not allow this now (wrong lifecycle state, duplicate, already running).
Media typeapplication/json
object
error
required
object
code
required

The error-code catalogue: VALIDATION_ERROR 400, UNAUTHENTICATED 401, SPEND_CAP_EXCEEDED 402, TENANT_AI_BUDGET_EXCEEDED 402, FORBIDDEN 403, NOT_FOUND 404, CONFLICT 409, GONE 410, ENDPOINT_REMOVED 410, PAYLOAD_TOO_LARGE 413, UNSUPPORTED_MEDIA_TYPE 415, RATE_LIMITED 429, INTERNAL 500, PROVIDER_ERROR 502, SERVICE_UNAVAILABLE 503, WEAK_PASSWORD 400, INVALID_TOKEN 400, EXPIRED_TOKEN 400, INVALID_CREDENTIALS 401, INVALID_CODE 401, SSO_REQUIRED 403, SLUG_TAKEN 409, LAST_ADMIN 409, MANAGED_BY_IDP 409, LOCKED 429, ASSET_KIND_NOT_ALLOWED 400, ASSET_SOURCE_NOT_ALLOWED 400, LIBRARY_ARCHIVED 409, MISSING_SCOPES 400, CLASSIC_TOKEN 400, INVALID_CREDENTIAL 400, CLOUD_ID_UNRESOLVED 400, SITE_NOT_FOUND 400, INTEGRATION_AUTH 409, INTEGRATION_NOT_CONNECTED 409, SITE_CHOICE_EXPIRED 409, PLATFORM_NOT_CONFIGURED 503, PLAN_LIMIT_REACHED 403, PLAN_FEATURE_UNAVAILABLE 403, TRIAL_EXPIRED 403, INSUFFICIENT_SCOPE 403, API_DISABLED 403, IDEMPOTENCY_CONFLICT 409. Extensible.

string
Allowed values: VALIDATION_ERROR UNAUTHENTICATED SPEND_CAP_EXCEEDED TENANT_AI_BUDGET_EXCEEDED FORBIDDEN NOT_FOUND CONFLICT GONE ENDPOINT_REMOVED PAYLOAD_TOO_LARGE UNSUPPORTED_MEDIA_TYPE RATE_LIMITED INTERNAL PROVIDER_ERROR SERVICE_UNAVAILABLE WEAK_PASSWORD INVALID_TOKEN EXPIRED_TOKEN INVALID_CREDENTIALS INVALID_CODE SSO_REQUIRED SLUG_TAKEN LAST_ADMIN MANAGED_BY_IDP LOCKED ASSET_KIND_NOT_ALLOWED ASSET_SOURCE_NOT_ALLOWED LIBRARY_ARCHIVED MISSING_SCOPES CLASSIC_TOKEN INVALID_CREDENTIAL CLOUD_ID_UNRESOLVED SITE_NOT_FOUND INTEGRATION_AUTH INTEGRATION_NOT_CONNECTED SITE_CHOICE_EXPIRED PLATFORM_NOT_CONFIGURED PLAN_LIMIT_REACHED PLAN_FEATURE_UNAVAILABLE TRIAL_EXPIRED INSUFFICIENT_SCOPE API_DISABLED IDEMPOTENCY_CONFLICT
message
required

Human-readable message

string
scope

INSUFFICIENT_SCOPE: the scope the operation needs

string
reason

FORBIDDEN: why (member_inactive, permission_missing, not_opted_in, user_only, role, …)

string
error
required
object
code
string
Allowed values: CONFLICT

Examples

ExampleCONFLICT

The resource's state does not allow this now (wrong lifecycle state, duplicate, already running).

{
"error": {
"code": "CONFLICT",
"message": "Cannot process assessment with status \"uploaded\". Must be \"analyzed\" (run Analyze first)."
}
}
  • RATE_LIMITED — Too many requests; retry after the Retry-After header.

Retry-After and RateLimit-* tell when to retry.

Media typeapplication/json
object
error
required
object
code
required

The error-code catalogue: VALIDATION_ERROR 400, UNAUTHENTICATED 401, SPEND_CAP_EXCEEDED 402, TENANT_AI_BUDGET_EXCEEDED 402, FORBIDDEN 403, NOT_FOUND 404, CONFLICT 409, GONE 410, ENDPOINT_REMOVED 410, PAYLOAD_TOO_LARGE 413, UNSUPPORTED_MEDIA_TYPE 415, RATE_LIMITED 429, INTERNAL 500, PROVIDER_ERROR 502, SERVICE_UNAVAILABLE 503, WEAK_PASSWORD 400, INVALID_TOKEN 400, EXPIRED_TOKEN 400, INVALID_CREDENTIALS 401, INVALID_CODE 401, SSO_REQUIRED 403, SLUG_TAKEN 409, LAST_ADMIN 409, MANAGED_BY_IDP 409, LOCKED 429, ASSET_KIND_NOT_ALLOWED 400, ASSET_SOURCE_NOT_ALLOWED 400, LIBRARY_ARCHIVED 409, MISSING_SCOPES 400, CLASSIC_TOKEN 400, INVALID_CREDENTIAL 400, CLOUD_ID_UNRESOLVED 400, SITE_NOT_FOUND 400, INTEGRATION_AUTH 409, INTEGRATION_NOT_CONNECTED 409, SITE_CHOICE_EXPIRED 409, PLATFORM_NOT_CONFIGURED 503, PLAN_LIMIT_REACHED 403, PLAN_FEATURE_UNAVAILABLE 403, TRIAL_EXPIRED 403, INSUFFICIENT_SCOPE 403, API_DISABLED 403, IDEMPOTENCY_CONFLICT 409. Extensible.

string
Allowed values: VALIDATION_ERROR UNAUTHENTICATED SPEND_CAP_EXCEEDED TENANT_AI_BUDGET_EXCEEDED FORBIDDEN NOT_FOUND CONFLICT GONE ENDPOINT_REMOVED PAYLOAD_TOO_LARGE UNSUPPORTED_MEDIA_TYPE RATE_LIMITED INTERNAL PROVIDER_ERROR SERVICE_UNAVAILABLE WEAK_PASSWORD INVALID_TOKEN EXPIRED_TOKEN INVALID_CREDENTIALS INVALID_CODE SSO_REQUIRED SLUG_TAKEN LAST_ADMIN MANAGED_BY_IDP LOCKED ASSET_KIND_NOT_ALLOWED ASSET_SOURCE_NOT_ALLOWED LIBRARY_ARCHIVED MISSING_SCOPES CLASSIC_TOKEN INVALID_CREDENTIAL CLOUD_ID_UNRESOLVED SITE_NOT_FOUND INTEGRATION_AUTH INTEGRATION_NOT_CONNECTED SITE_CHOICE_EXPIRED PLATFORM_NOT_CONFIGURED PLAN_LIMIT_REACHED PLAN_FEATURE_UNAVAILABLE TRIAL_EXPIRED INSUFFICIENT_SCOPE API_DISABLED IDEMPOTENCY_CONFLICT
message
required

Human-readable message

string
scope

INSUFFICIENT_SCOPE: the scope the operation needs

string
reason

FORBIDDEN: why (member_inactive, permission_missing, not_opted_in, user_only, role, …)

string
error
required
object
code
string
Allowed values: RATE_LIMITED

Examples

ExampleRATE_LIMITED

Too many requests; retry after the Retry-After header.

{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests — retry after the Retry-After header"
}
}

Privacy preference center

When you visit tradecrafthub.ai, we store or read a small number of cookies in your browser. Strictly necessary cookies make the website and the Tradecraft app work. Analytics cookies are used only if you allow them. Open a category to learn more, and see our privacy policy for how we handle the information you enter on this site.

Manage consent preferences

  • Always active