---
title: "Request imported thesis position enrichment"
method: POST
path: "/v2/social/theses/{event_id}/position-history/ensure"
tags: ["Social Community"]
---

# Request imported thesis position enrichment

`POST /v2/social/theses/{event_id}/position-history/ensure`

## Request

- Base URL: `https://api.arbital.xyz` (the document declares no server; this is the origin it was published from)
- URL: `https://api.arbital.xyz/v2/social/theses/{event_id}/position-history/ensure`
- Auth: HTTP bearer

Requires Privy bearer authentication and the existing social-write rate budget. Body must be empty or {}; query parameters are forbidden. Server resolves the public event UUID to the current visible provider post and identity. Never accepts a wallet, provider target or forced refresh. Returns cached available or explicitly unavailable results immediately. Otherwise invokes the separately credentialed narrow Projector request RPC once with a 1500ms deadline, returning 202 only after durable queue acknowledgment; lost acknowledgment/unconfigured service returns 503. An identical retry deduplicates at Projector. Existing closed results may accompany pending status. No waiting loop or provider acquisition runs in the HTTP request. Unsupported visible theses may return 200 unavailable. Poll the read-only history GET after Retry-After; do not automatically POST on every view.

## Path parameters

- `event_id` string, uuid, required

## Request body

- object

## Response `200`

Cached available or explicitly unavailable position result

- ExternalSocialPositionEnsureResult: Explicit on-demand request result. History may retain closed cycles while work is pending. Pending responses follow a durable queue ACK. The backend does not call Codex, submit worker evidence, or create position outcomes.
  - `request_status` ExternalSocialPositionRequestStatus, required: Explicit computation status. unavailable identifies an unsupported or terminally unresolved observation; an empty items array alone is not a work signal. queued/running/retry_scheduled are pending. Observe Retry-After; GET never queues work.
    - `state` 'available' | 'queued' | 'running' | 'retry_scheduled' | 'unavailable', required
    - `reason` string, nullable, required
    - `retry_after_seconds` integer, required
  - `history` ExternalSocialPositionHistoryPage, required: Read-only indexer social position observations. Unknown/stale current status may retain previously observed closed cycles. These results never supply portfolio balances, quote eligibility, transaction authority, or tax basis. Wallet addresses are not exposed.
    - `source` 'codex', required
    - `calculation_status` 'provider_estimate', required
    - `fees_status` 'unavailable', required
    - `asset` object, required
      - `chain_id` 'solana:mainnet-beta', required
      - `address` string, required
      - `decimals` integer, nullable, required
    - `lifecycle` object, required
      - `state` 'open' | 'closed' | 'unknown', required
      - `reason` string, nullable, required
      - `observed_at_ms` integer, nullable, required
      - `freshness` 'fresh' | 'stale', required
      - `calculation_version` string, required
      - `current_quantity_atomic` string, nullable, required
    - `items` ExternalSocialPositionCycle[], required
      - `id` string, required
      - `state` 'open' | 'closed', required
      - `opened_at_ms` integer, required
      - `closed_at_ms` integer, nullable, required
      - `bought_quantity_atomic` string, required
      - `sold_quantity_atomic` string, required
      - `remaining_quantity_atomic` string, required
      - `realized_pnl_usd` string, nullable, required
      - `cost_basis_usd` string, nullable, required
      - `proceeds_usd` string, nullable, required
      - `includes_thesis` boolean, required
    - `next_cursor` string, nullable, required
    - `request_status` ExternalSocialPositionRequestStatus, required: Explicit computation status. unavailable identifies an unsupported or terminally unresolved observation; an empty items array alone is not a work signal. queued/running/retry_scheduled are pending. Observe Retry-After; GET never queues work.
      - `state` 'available' | 'queued' | 'running' | 'retry_scheduled' | 'unavailable', required
      - `reason` string, nullable, required
      - `retry_after_seconds` integer, required

## Other responses

- `202`: Durably acknowledged queued, running, or retry-scheduled acquisition; honor Retry-After and poll GET
- `400`: Stable machine-readable problem. HTTP 429 and 503 responses include retry and cache-validity fields plus Retry-After and X-Request-ID headers.
- `401`: Stable machine-readable problem. HTTP 429 and 503 responses include retry and cache-validity fields plus Retry-After and X-Request-ID headers.
- `404`: Stable machine-readable problem. HTTP 429 and 503 responses include retry and cache-validity fields plus Retry-After and X-Request-ID headers.
- `413`: Request body exceeds 1024 bytes
- `429`: Stable machine-readable problem. HTTP 429 and 503 responses include retry and cache-validity fields plus Retry-After and X-Request-ID headers.
- `503`: Stable machine-readable problem. HTTP 429 and 503 responses include retry and cache-validity fields plus Retry-After and X-Request-ID headers.

---

[API](https://skmtc.dev/arbital/apis/arbital-api.md) - [All operations](https://skmtc.dev/arbital/apis/arbital-api/llms.txt) - [OpenAPI document](https://skmtc.dev/arbital/apis/arbital-api/revisions/bb0185edf43a?raw)
