Accept a pending project transfer (the recipient, whatever its address)
The ONE completion route. The row's recipient kind picks the credential: a wallet-addressed transfer is accepted by the to_wallet's SIWX signature; an email-addressed transfer is accepted by a sign-in session (or SIWX principal) whose verified email matches, into an org it owns (org_id) or, with org_id omitted, a newly created wallet-less org. Both paths run the same atomic transaction: ownership flip + grant/CI revoke + notification enqueue (one per recipient) + secrets-rotation advisory stamp + audit row, all in one COMMIT, and both return the project's anon_key + service_key. Routes scope by transfer_id (NOT project_id) — stale-offer safe. If the preview carries retain_member, accept_retained_member: true keeps the sender on as a developer of the receiving org; default false severs access. Pre-condition codes: CONTACT_EMAIL_NOT_VERIFIED (412), RECIPIENT_ORGANIZATION_NOT_ACTIVE (409), PROJECT_NOT_TRANSFERABLE (409), PROJECT_OWNER_CHANGED (409), TRANSFER_EXPIRED (410). Uses clock_timestamp() for the expiry check (NOT NOW() — would be stale under lock waits).
Request
- Base URL: https://api.run402.com
- URL: https://api.run402.com/agent/v1/transfers/{transfer_id}/accept
- Auth: one of:
- API key in header SIGN-IN-WITH-X
- HTTP bearer
Path parameters
Headers
SIWX auth header — base64-encoded JSON payload containing a signed CAIP-122 (EIP-4361) message. See https://docs.x402.org/extensions/sign-in-with-x.
Request body
Response
Accept succeeded (ownership flipped). A wallet-addressed row returns AcceptTransferResponse; an email-addressed row returns {status: 'accepted', project_id, to_org_id, created_new_org, retained_member_principal_id, credentials_revoked, credentials_issued}. Both carry anon_key + service_key.
Changes
No recorded changes to this operation across all 1 revision of this API.