{"openapi":"3.0.0","paths":{"/bedrock/onboard":{"post":{"description":"Collects everything KYC and incorporation need in one request, so founders are never asked\nfor the same detail twice. Creates the project's Bedrock company and returns its\n`companyId` — the identifier every later call should use.\n\n`tokenAddress` is optional: onboard before the token is deployed and attach the address\nlater. When supplied it must be unique across projects.\n\nShare allocations must satisfy\n`sum(shareholders[*].shareBasisPoint) + bedrockShareBasisPoint === 10000`, or the request is\nrejected with a `400`.","operationId":"BedrockLaunchpadIntegrationController_onboard","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockCreateApiRequestDto"}}}},"responses":{"201":{"description":"Project onboarded successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockOnboardApiResponseDto"}}}},"400":{"description":"Validation error or duplicate token address"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Onboard a new Bedrock project","tags":["Bedrock"]}},"/bedrock/details/by-id/{companyId}":{"get":{"operationId":"BedrockLaunchpadIntegrationController_detailsById","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Project details returned successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockDetailsApiResponseDto"}}}},"404":{"description":"Project not found or does not belong to this API key"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Get Bedrock project details by company ID","tags":["Bedrock"]}},"/bedrock/details/by-token-address/{tokenAddress}":{"get":{"operationId":"BedrockLaunchpadIntegrationController_details","parameters":[{"name":"tokenAddress","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Project details returned successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockDetailsApiResponseDto"}}}},"404":{"description":"Project not found or does not belong to this API key"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Get Bedrock project details by token address","tags":["Bedrock"]}},"/bedrock/details/{tokenAddress}":{"get":{"deprecated":true,"description":"Use GET /bedrock/details/by-id/{companyId}, or by-token-address/{tokenAddress}.","operationId":"BedrockLaunchpadIntegrationController_detailsDeprecated","parameters":[{"name":"tokenAddress","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Project details returned successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockDetailsApiResponseDto"}}}},"404":{"description":"Project not found or does not belong to this API key"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Deprecated: get Bedrock project details by token address","tags":["Bedrock"]}},"/bedrock/token-address/by-id/{companyId}":{"post":{"description":"Write-once: re-sending the address already stored succeeds unchanged, a different one is a conflict. Only keyed by company ID — a project without an address cannot be found by one.","operationId":"BedrockLaunchpadIntegrationController_attachTokenAddress","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockAttachTokenAddressApiRequestDto"}}}},"responses":{"201":{"description":"Token address attached successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockAttachTokenAddressApiResponseDto"}}}},"400":{"description":"Invalid address for the given blockchain, or already used by another project"},"404":{"description":"Project not found or does not belong to this API key"},"409":{"description":"Project already has a different token address attached"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Attach the token address of a project onboarded before its token was deployed","tags":["Bedrock"]}},"/bedrock/start-incorporation/by-id/{companyId}":{"post":{"description":"Valid only while the project is `INCORPORATION_NOT_STARTED`; calling it in any other state\nreturns a `400`. Every founder must have completed KYC (`kycStatus === VERIFIED`) and\nsigned the PEP declaration they made in the questionnaire (`pepCompleted === true`) first — otherwise,\nalso a `400`. The declaration is emailed to them to sign through DocuSign when they submit it.\n\nOn success the project moves to `IN_PROGRESS` and Bedrock SPC is attached as the corporate\nshareholder holding `bedrockShareBasisPoint`, so the share register totals 100% before any\nprovider work begins. Nothing is started when the call fails, so a rejected attempt is safe\nto retry once the blocking condition is resolved.","operationId":"BedrockLaunchpadIntegrationController_startIncorporationById","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Incorporation started successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockStartIncorporationApiResponseDto"}}}},"400":{"description":"Incorporation already started or invalid state"},"404":{"description":"Project not found or does not belong to this API key"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Start the incorporation process for a project by company ID","tags":["Bedrock"]}},"/bedrock/start-incorporation/by-token-address/{tokenAddress}":{"post":{"operationId":"BedrockLaunchpadIntegrationController_startIncorporation","parameters":[{"name":"tokenAddress","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Incorporation started successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockStartIncorporationApiResponseDto"}}}},"400":{"description":"Incorporation already started or invalid state"},"404":{"description":"Project not found or does not belong to this API key"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Start the incorporation process for a project by token address","tags":["Bedrock"]}},"/bedrock/start-incorporation/{tokenAddress}":{"post":{"deprecated":true,"description":"Use POST /bedrock/start-incorporation/by-id/{companyId}, or by-token-address/{tokenAddress}.","operationId":"BedrockLaunchpadIntegrationController_startIncorporationDeprecated","parameters":[{"name":"tokenAddress","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Incorporation started successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockStartIncorporationApiResponseDto"}}}},"400":{"description":"Incorporation already started or invalid state"},"404":{"description":"Project not found or does not belong to this API key"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Deprecated: start the incorporation process for a project by token address","tags":["Bedrock"]}},"/bedrock/form-urls/by-id/{companyId}":{"get":{"operationId":"BedrockLaunchpadIntegrationController_formUrlsById","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Form URLs generated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockFormUrlsApiResponseDto"}}}},"400":{"description":"bedrockFormUrl not configured, or incorporation status disallows regeneration"},"404":{"description":"Project not found or does not belong to this API key"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Re-generate Bedrock form URLs for all shareholders of a project by company ID","tags":["Bedrock"]}},"/bedrock/form-urls/by-token-address/{tokenAddress}":{"get":{"operationId":"BedrockLaunchpadIntegrationController_formUrls","parameters":[{"name":"tokenAddress","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Form URLs generated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockFormUrlsApiResponseDto"}}}},"400":{"description":"bedrockFormUrl not configured, or incorporation status disallows regeneration"},"404":{"description":"Project not found or does not belong to this API key"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Re-generate Bedrock form URLs for all shareholders of a project by token address","tags":["Bedrock"]}},"/bedrock/form-urls/{tokenAddress}":{"get":{"deprecated":true,"description":"Use GET /bedrock/form-urls/by-id/{companyId}, or by-token-address/{tokenAddress}.","operationId":"BedrockLaunchpadIntegrationController_formUrlsDeprecated","parameters":[{"name":"tokenAddress","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Form URLs generated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockFormUrlsApiResponseDto"}}}},"400":{"description":"bedrockFormUrl not configured, or incorporation status disallows regeneration"},"404":{"description":"Project not found or does not belong to this API key"}},"security":[{"x-bedrock-api-key":[]}],"summary":"Deprecated: re-generate Bedrock form URLs for all shareholders of a project by token address","tags":["Bedrock"]}},"/bedrock/list":{"get":{"description":"Scoped to the projects of the service the key was issued to. Ordered newest first, and\npaginated through `limit` and `offset` — the response envelope carries `total`, `limit`,\n`offset` and `result`.\n\nEach entry carries the same reduced shareholder shape as `details`.","operationId":"BedrockLaunchpadIntegrationController_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Maximum number of results to return","schema":{"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip for pagination","schema":{"example":0,"type":"number"}}],"responses":{"200":{"description":"Paginated list of Bedrock projects","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BedrockListApiResponseDto"}}}}},"security":[{"x-bedrock-api-key":[]}],"summary":"List all Bedrock projects for the authenticated API key","tags":["Bedrock"]}}},"info":{"title":"Bedrock","description":"Incorporate the company behind each Bedrock launchpad project.\n\n- **Onboard a project** with its founders and their share allocations in one request —\n  everything KYC and incorporation need, so no founder is asked for the same detail twice.\n  The token address can come later.\n- **Send founders their forms.** Every shareholder gets their own form link; re-generate them\n  whenever one goes astray.\n- **Start the incorporation** once every shareholder, not only the founders, has passed KYC\n  and every individual has signed their PEP declaration. Bedrock SPC joins as the corporate\n  shareholder, so the register totals 100% before any filing begins.\n- **Track it.** Read a project's details, or list every project you have onboarded, newest\n  first.\n\n## Authentication\n\nSend the key GVRN issued you in the `x-bedrock-api-key` header on every request.\nBedrock keys expire, so ask for a new one before yours does.\n\n```bash\ncurl http://localhost:3000/bedrock/list \\\n  --header 'x-bedrock-api-key: YOUR_KEY'\n```\n\n## How a launch runs\n\nOnboard the project when the founders create a sale, start the incorporation once the launch\nhas succeeded, and read its details to follow each step. Paths are relative to `/bedrock`, and\neach call after onboarding addresses the project as `by-id/:companyId`.\n\n```mermaid\nsequenceDiagram\n  autonumber\n  participant F as Shareholders\n  participant L as Launchpad\n  participant G as GVRN\n  F->>L: Founders' details, create a sale\n  L->>G: POST /onboard\n  G-->>L: companyId, a form URL per shareholder\n  L-->>F: Complete the Bedrock form and KYC\n  loop Until isReadyForIncorporation\n    L->>G: GET /details\n    G-->>L: kycStatus and pepCompleted per shareholder\n  end\n  L->>L: Run the sale\n  opt Token deployed after onboarding\n    L->>G: POST /token-address\n  end\n  L->>G: POST /start-incorporation\n  G-->>L: success\n  Note over L,G: GVRN reserves the name and files the company\n  L->>G: GET /details\n  G-->>L: incorporationStatus\n```\n\n`isReadyForIncorporation` on the details turns `true` once every shareholder has passed KYC,\nand every individual has signed their PEP declaration and acknowledged the IP attribution. That\nflag is the gate `start-incorporation` checks, so poll for it rather than for the founders alone.\n\n## Identifiers\n\n**`companyId` is the canonical identifier** for a project, returned by `onboard`,\n`details` and `list`. A token contract address identifies a project too, but only once it\nhas one — `tokenAddress` is optional at onboarding, so a project can be onboarded before its\ntoken is deployed and attach the address later.\n\n- **`by-id/:companyId`** — canonical, UUID-validated, and the only shape that reaches a\n  project with no token address.\n- **`by-token-address/:tokenAddress`** — resolves a project from an address it already has,\n  matched case-insensitively.\n- **bare `:tokenAddress`** — deprecated. Kept working for already-deployed clients, and\n  answers with `Deprecation: true` (RFC 8594).\n\nPrefer `by-id/` for anything new. A token address, when present, must be unique across\nprojects; duplicates are rejected.\n\n## Share allocations\n\nExpressed in **basis points** (1 bp = 0.01%). An onboarding request must satisfy\n`sum(shareholders[*].shareBasisPoint) + bedrockShareBasisPoint === 10000`; anything else is a\n`400`. Basis points are converted against the company's 100 assigned shares, so 4950 bps is\n49.5 shares — fractional allocations are expected.\n\n## Errors\n\nErrors are JSON and carry the status in the body as well as the status line:\n\n```json\n{ \"statusCode\": 400, \"message\": \"...\", \"error\": \"Bad Request\" }\n```\n\n`message` is a string for most failures and an **array of strings** when request validation\nrejects several fields at once, so parse it defensively.\n\n| Status | Means |\n| --- | --- |\n| `400` | Malformed request, or a field we do not accept |\n| `401` | Key missing, disabled, expired, or deleted |\n| `403` | Key is valid but not permitted to do this |\n| `404` | No such resource, or one you cannot reach |\n| `429` | Rate limited — see below |\n| `5xx` | Our fault; retry an idempotent read with backoff |\n\nUnknown body fields are **rejected rather than ignored**, so a typo in a field name is a `400`\nrather than a silently dropped value.\n\n## Rate limits\n\nRequests are rate limited per client IP address and **per endpoint**: each one has\nits own budget, so exhausting a read does not lock you out of the rest of the API.\n\nExceeding a budget returns `429` with a `Retry-After` header giving the seconds to wait. Honour\nit rather than retrying immediately, and back off exponentially if you keep hitting it.\n\nThe ceiling is deliberately not published as a number: it is tuned per environment and we would\nrather you follow `Retry-After` than encode a constant that later changes. If you need sustained\nthroughput above what you are seeing, talk to us instead of parallelising around it.\n\n## Conventions\n\nTimestamps are ISO 8601. Monetary amounts are USD unless the field says otherwise, and prices\ncome back as numbers rather than strings.\n\nEnumerated fields document their full set of values on the endpoint that returns them, and that\nset can grow — decode a member you do not recognise gracefully rather than failing. The same\ngoes for response fields: ignore ones you were not expecting.\n\nWhere a route shape is retired we keep the old one working and mark it deprecated rather than\nremoving it, and answer it with `Deprecation: true` (RFC 8594). Move off one when you see that\nheader rather than when it stops working.","version":"1.49.1-dev.2","contact":{}},"tags":[{"name":"Bedrock","description":"The launchpad integration: onboard a project, take its company through incorporation, and\ntrack where it has got to."}],"servers":[],"components":{"schemas":{"GvrnPersonShareholderDto":{"type":"object","properties":{"type":{"type":"string","enum":["PERSON","COMPANY"],"example":"PERSON"},"firstName":{"type":"string","description":"First name of the shareholder","example":"John"},"lastName":{"type":"string","description":"Last name of the shareholder","example":"Doe"},"email":{"type":"string","description":"Email of the shareholder","example":"john.doe@example.com"},"nationalityCountry":{"type":"string","description":"Country of nationality, must be a valid ISO 3166-1 alpha-3 code","example":"USA"},"taxResidencyCountry":{"type":"string","description":"Country of tax residence, must be a valid ISO 3166-1 alpha-3 code","example":"SGP"},"residentialAddress":{"type":"string","description":"Residential address","example":"Some Address, City, Country"},"shareBasisPoint":{"type":"number","description":"Project share basis point owned by shareholder","example":6900},"isFounder":{"type":"boolean","description":"Whether this shareholder is also a founder; creates an additional FOUNDER relationship","example":false}},"required":["type","firstName","lastName","email","nationalityCountry","taxResidencyCountry","residentialAddress","shareBasisPoint"]},"GvrnCompanyShareholderDto":{"type":"object","properties":{"type":{"type":"string","enum":["PERSON","COMPANY"],"example":"COMPANY"},"legalCompanyName":{"type":"string","description":"Legal company name of the shareholder","example":"Acme Holdings Ltd"},"registrationNumber":{"type":"string","description":"Registration number of the company","example":"202312345A"},"email":{"type":"string","description":"Email of the corporate shareholder","example":"contact@acme.com"},"country":{"type":"string","description":"Country of incorporation, must be a valid ISO 3166-1 alpha-3 code","example":"SGP"},"registeredAddress":{"type":"string","description":"Registered office address of the company","example":"1 Raffles Place, Singapore"},"corporateRepresentativeFirstName":{"type":"string","description":"First name of the company's corporate representative","example":"Jane"},"corporateRepresentativeLastName":{"type":"string","description":"Last name of the company's corporate representative","example":"Tan"},"corporateRepresentativeEmail":{"type":"string","description":"Email of the company's corporate representative. Recorded as a Person on the shareholder company under the CORPORATE_REPRESENTATIVE relationship, and adopted as the company's primary contact email when it has none.","example":"qa+jane-tan@gvrn.ai"},"shareBasisPoint":{"type":"number","description":"Project share basis point owned by shareholder","example":6900},"isFounder":{"type":"boolean","description":"Whether this shareholder is also a founder; creates an additional FOUNDER relationship","example":false}},"required":["type","legalCompanyName","registrationNumber","email","country","registeredAddress","corporateRepresentativeFirstName","corporateRepresentativeLastName","corporateRepresentativeEmail","shareBasisPoint"]},"BedrockCreateApiRequestDto":{"type":"object","properties":{"projectName":{"type":"string","description":"Project Name","example":"Project ABC"},"blockchain":{"type":"string","description":"Blockchain type for the token address. Defaults to SOLANA.","enum":["SOLANA","BASE"],"example":"SOLANA"},"tokenAddress":{"type":"string","description":"Project token contract/program address. Omit when the token is not deployed yet — the project is then identified by the `companyId` this endpoint returns, and attaches its address later through POST /bedrock/token-address/by-id/{companyId}.","example":"METvsvVRapdj9cFLzq4Tr43xK4tAjQfwX76z3n6mWQL"},"shareholders":{"type":"array","description":"List of shareholders for the company. At least one must set `isFounder`: a project with no founder cannot be incorporated and cannot be repaired through the shareholder form, whose routes are all authorized by a founder link.","items":{"oneOf":[{"$ref":"#/components/schemas/GvrnPersonShareholderDto"},{"$ref":"#/components/schemas/GvrnCompanyShareholderDto"}]}},"founders":{"type":"object","description":"Deprecated: use shareholders instead","deprecated":true},"requestOriginIpAddress":{"type":"string","example":"8.8.4.4","description":"Originating IP address"},"category":{"type":"string","description":"Project category","example":"AI","enum":["RWA","AI","DEFI","INFRA","DEPIN","LEGAL","GAMING","NFT","MEME"]},"twitterHandle":{"type":"string","description":"Project Twitter handle (alphanumeric and underscores only, no @ prefix)","example":"example_project","maxLength":50},"bedrockShareBasisPoint":{"type":"number","description":"Share basis point allocated to Bedrock (min 100 = 1%, max 3000 = 30%)","example":2000,"minimum":100,"maximum":3000},"preferredCompanyNames":{"description":"List of exactly 3 preferred company names in order of preference","example":["Alpha Holdings Ltd","Beta Ventures Ltd","Gamma Capital Ltd"],"items":{"type":"string","maxLength":100},"minItems":3,"maxItems":3,"type":"array"}},"required":["projectName","shareholders","requestOriginIpAddress","bedrockShareBasisPoint","preferredCompanyNames"]},"GvrnShareholderPepDto":{"type":"object","properties":{"isSelfPoliticallyExposed":{"type":"boolean","description":"Whether the shareholder is self-politically exposed","nullable":true},"selfPoliticalPositions":{"type":"string","description":"Description of self political positions","nullable":true},"isCloseToPoliticallyExposed":{"type":"boolean","description":"Whether the shareholder is close to a politically exposed person","nullable":true},"closeToPoliticallyExposedFullName":{"type":"string","description":"Full name of the politically exposed person they are close to","nullable":true},"closeToPoliticallyExposedPositions":{"type":"string","description":"Political positions held by the person they are close to","nullable":true},"closeToPoliticallyExposedRelationship":{"type":"string","description":"Relationship to the politically exposed person","nullable":true},"politicallyExposedDataUpdatedAt":{"type":"string","description":"When PEP data was last updated","nullable":true}},"required":["isSelfPoliticallyExposed","selfPoliticalPositions","isCloseToPoliticallyExposed","closeToPoliticallyExposedFullName","closeToPoliticallyExposedPositions","closeToPoliticallyExposedRelationship","politicallyExposedDataUpdatedAt"]},"BedrockPersonShareholderApiResponseDto":{"type":"object","properties":{"type":{"type":"string","enum":["PERSON","COMPANY"],"example":"PERSON"},"shareholderId":{"type":"string","description":"ID of the shareholder person record","example":"123e4567-e89b-12d3-a456-426614174000"},"founderId":{"type":"string","description":"Deprecated: use shareholderId instead","deprecated":true,"example":"123e4567-e89b-12d3-a456-426614174000"},"firstName":{"type":"string","description":"First name of the shareholder","example":"John"},"lastName":{"type":"string","description":"Last name of the shareholder","example":"Doe"},"kycStatus":{"type":"string","description":"Status of the KYC process, if applicable","example":"PENDING","enum":["PENDING","VERIFIED","REJECTED","EXPIRED"]},"shareBasisPoint":{"type":"number","description":"Project share basis point owned by shareholder","example":4000},"bedrockFormUrl":{"type":"string","description":"URL to the Bedrock onboarding form for this shareholder. Omitted for a shareholder matched by email to a person GVRN already holds, or one no longer this project's alone, whose link is emailed to them instead"},"userPepForm":{"description":"What the shareholder answered in the PEP questionnaire, if they answered it. Not the check: a declaration signed offline and filed by GVRN leaves these fields empty while `pepCompleted` is true.","allOf":[{"$ref":"#/components/schemas/GvrnShareholderPepDto"}]},"pepCompleted":{"type":"boolean","description":"Whether the shareholder's PEP check is satisfied — the declaration they made in the questionnaire is signed in DocuSign, or a declaration they signed elsewhere is on file against them","example":false},"pepStatus":{"type":"string","description":"Where the shareholder's PEP declaration stands: not yet made, made and waiting to be sent for signature, out for signature in DocuSign, or completed","enum":["NOT_DECLARED","NOT_SENT","AWAITING_SIGNATURE","COMPLETED"],"example":"AWAITING_SIGNATURE"},"ipAttributionAcknowledgedAt":{"type":"string","description":"When the shareholder acknowledged IP attribution, if applicable"}},"required":["type","shareholderId","firstName","lastName","userPepForm","pepCompleted","pepStatus"]},"GvrnCorporateRepresentativeApiResponseDto":{"type":"object","properties":{"personId":{"type":"string","description":"Person id of the representative","example":"123e4567-e89b-12d3-a456-426614174000"},"firstName":{"type":"string","description":"First name of the representative","example":"Jane"},"lastName":{"type":"string","description":"Last name of the representative","example":"Tan"},"email":{"type":"string","description":"Email of the representative","example":"qa+jane-tan@gvrn.ai"}},"required":["personId","firstName","lastName"]},"BedrockCompanyShareholderApiResponseDto":{"type":"object","properties":{"type":{"type":"string","enum":["PERSON","COMPANY"],"example":"COMPANY"},"shareholderId":{"type":"string","description":"ID of the shareholder company record","example":"123e4567-e89b-12d3-a456-426614174000"},"legalCompanyName":{"type":"string","description":"Legal company name of the shareholder","example":"Acme Holdings Ltd"},"registrationNumber":{"type":"string","description":"Registration number of the company","example":"202312345A"},"email":{"type":"string","description":"Email of the corporate shareholder","example":"contact@acme.com"},"country":{"type":"string","description":"Country of incorporation, must be a valid ISO 3166-1 alpha-3 code","example":"SGP"},"registeredAddress":{"type":"string","description":"Registered office address","example":"1 Raffles Place, Singapore"},"corporateRepresentatives":{"description":"Natural persons authorised to act for this corporate shareholder","type":"array","items":{"$ref":"#/components/schemas/GvrnCorporateRepresentativeApiResponseDto"}},"shareBasisPoint":{"type":"number","description":"Project share basis point owned by shareholder","example":4000},"kycStatus":{"type":"string","description":"Status of the KYC process, if applicable","example":"PENDING","enum":["PENDING","VERIFIED","REJECTED","EXPIRED"]},"bedrockFormUrl":{"type":"string","description":"URL to the Bedrock onboarding form for this corporate shareholder. Omitted for a company matched by registration number to one GVRN already holds, whose link is emailed to its contact instead"}},"required":["type","shareholderId","legalCompanyName","corporateRepresentatives"]},"BedrockOnboardApiResponseDto":{"type":"object","properties":{"companyId":{"type":"string","description":"ID of the company just created — the client-agnostic identifier every other endpoint accepts","example":"123e4567-e89b-12d3-a456-426614174000"},"tokenAddress":{"type":"string","description":"Project token contract/program address; absent until the project's token is deployed","example":"METvsvVRapdj9cFLzq4Tr43xK4tAjQfwX76z3n6mWQL"},"blockchain":{"type":"string","description":"Blockchain the token is deployed on","enum":["ETHEREUM","BASE","HYPERLIQUID","BERACHAIN","SOLANA"],"example":"SOLANA"},"incorporationStatus":{"type":"string","description":"Status of the incorporation request","example":"INCORPORATION_NOT_STARTED","enum":["INCORPORATED","INCORPORATION_NOT_STARTED","IN_PROGRESS","REGISTERED","LIVE","AMALGAMATED","IN_LIQUIDATION","UNDER_JUDICIAL_MANAGEMENT","REVOKED","STRIKING_OFF","STRUCK_OFF","GAZETTED_TO_BE_STRUCK_OFF","SUSPENDED","CONVERTED","DISSOLVED","CANCELLED","UNKNOWN_EXTERNAL"]},"shareholders":{"type":"array","description":"Each shareholder details","items":{"oneOf":[{"$ref":"#/components/schemas/BedrockPersonShareholderApiResponseDto"},{"$ref":"#/components/schemas/BedrockCompanyShareholderApiResponseDto"}]}},"founders":{"type":"array","description":"Deprecated: use shareholders instead","deprecated":true,"items":{"oneOf":[{"$ref":"#/components/schemas/BedrockPersonShareholderApiResponseDto"},{"$ref":"#/components/schemas/BedrockCompanyShareholderApiResponseDto"}]}},"bedrockShareBasisPoint":{"type":"number","description":"Share basis point allocated to Bedrock","example":2000},"category":{"type":"string","description":"Project category","example":"AI","enum":["RWA","AI","DEFI","INFRA","DEPIN","LEGAL","GAMING","NFT","MEME"],"nullable":true},"twitterHandle":{"type":"string","description":"Project Twitter handle","example":"example_handle","nullable":true},"createdAt":{"type":"string","description":"Date the project was created","example":"2024-01-01T00:00:00.000Z"},"preferredCompanyNames":{"description":"List of preferred company names in order of preference","example":["Alpha Holdings Ltd","Beta Ventures Ltd","Gamma Capital Ltd"],"type":"array","items":{"type":"string"}}},"required":["companyId","incorporationStatus","shareholders","bedrockShareBasisPoint","category","twitterHandle","createdAt","preferredCompanyNames"]},"BedrockPersonDetailsShareholderApiResponseDto":{"type":"object","properties":{"type":{"type":"string","enum":["PERSON","COMPANY"],"example":"PERSON"},"id":{"type":"string","description":"ID of the shareholder person record","example":"123e4567-e89b-12d3-a456-426614174000"},"firstName":{"type":"string","description":"First name of the shareholder","example":"John"},"lastName":{"type":"string","description":"Last name of the shareholder","example":"Doe"},"email":{"type":"string","description":"Email of the shareholder","example":"qa+john-doe@gvrn.ai"},"nationalityCountry":{"type":"string","description":"Country of nationality as an ISO 3166-1 alpha-3 code","example":"USA"},"taxResidencyCountry":{"type":"string","description":"Country of tax residence as an ISO 3166-1 alpha-3 code","example":"SGP"},"residentialAddress":{"type":"string","description":"Residential address","example":"Some Address, City, Country"},"kycStatus":{"type":"string","description":"Status of the KYC process, if applicable","example":"PENDING","enum":["PENDING","VERIFIED","REJECTED","EXPIRED"]},"pepCompleted":{"type":"boolean","description":"Whether the shareholder's PEP check is satisfied — the declaration they made in the PEP questionnaire is signed in DocuSign, or a declaration they signed elsewhere is on file against them","example":false},"pepStatus":{"type":"string","description":"Where the shareholder's PEP declaration stands: not yet made, made and waiting to be sent for signature, out for signature in DocuSign, or completed","enum":["NOT_DECLARED","NOT_SENT","AWAITING_SIGNATURE","COMPLETED"],"example":"AWAITING_SIGNATURE"},"ipAttributionAcknowledged":{"type":"boolean","description":"Whether the shareholder has acknowledged IP attribution","example":false},"kycSkipped":{"type":"boolean","description":"Whether an operator recorded this shareholder's KYC verification as already done outside GVRN. Waives the verification only — the PEP declaration and supporting documents are still required.","example":false},"shareBasisPoint":{"type":"number","description":"Project share basis point owned by shareholder","example":4000},"sharePercentage":{"type":"number","description":"Project share percentage owned by shareholder","example":40},"isFounder":{"type":"boolean","description":"Whether this shareholder also holds the FOUNDER role","example":false}},"required":["type","id","firstName","lastName","pepCompleted","pepStatus","ipAttributionAcknowledged","kycSkipped","isFounder"]},"BedrockCompanyDetailsShareholderApiResponseDto":{"type":"object","properties":{"type":{"type":"string","enum":["PERSON","COMPANY"],"example":"COMPANY"},"id":{"type":"string","description":"ID of the shareholder company record","example":"123e4567-e89b-12d3-a456-426614174000"},"legalCompanyName":{"type":"string","description":"Legal company name of the shareholder","example":"Acme Holdings Ltd"},"registrationNumber":{"type":"string","description":"Registration number of the company","example":"202312345A"},"registeredAddress":{"type":"string","description":"Registered office address","example":"1 Raffles Place, Singapore"},"corporateRepresentatives":{"description":"Natural persons authorised to act for this corporate shareholder","type":"array","items":{"$ref":"#/components/schemas/GvrnCorporateRepresentativeApiResponseDto"}},"email":{"type":"string","description":"Email of the corporate shareholder","example":"contact@acme.com"},"country":{"type":"string","description":"Country of incorporation, must be a valid ISO 3166-1 alpha-3 code","example":"SGP"},"shareBasisPoint":{"type":"number","description":"Project share basis point owned by shareholder","example":4000},"sharePercentage":{"type":"number","description":"Project share percentage owned by shareholder","example":40},"kycStatus":{"type":"string","description":"Status of the KYC process, if applicable","example":"PENDING","enum":["PENDING","VERIFIED","REJECTED","EXPIRED"]},"isFounder":{"type":"boolean","description":"Whether this shareholder also holds the FOUNDER role","example":false},"kycSkipped":{"type":"boolean","description":"Whether an operator recorded this shareholder's KYB as already done outside GVRN.","example":false}},"required":["type","id","legalCompanyName","corporateRepresentatives","isFounder","kycSkipped"]},"BedrockDetailsApiResponseDto":{"type":"object","properties":{"companyId":{"type":"string","description":"ID of the company being onboarded — the client-agnostic identifier","example":"123e4567-e89b-12d3-a456-426614174000"},"companyName":{"type":"string","description":"Display name of the company being onboarded","example":"Acme Labs Ltd"},"tokenAddress":{"type":"string","description":"Project token contract/program address","example":"METvsvVRapdj9cFLzq4Tr43xK4tAjQfwX76z3n6mWQL"},"blockchain":{"type":"string","description":"Blockchain the token is deployed on","enum":["ETHEREUM","BASE","HYPERLIQUID","BERACHAIN","SOLANA"],"example":"SOLANA"},"incorporationStatus":{"type":"string","description":"Status of the incorporation request","example":"INCORPORATION_NOT_STARTED","enum":["INCORPORATED","INCORPORATION_NOT_STARTED","IN_PROGRESS","REGISTERED","LIVE","AMALGAMATED","IN_LIQUIDATION","UNDER_JUDICIAL_MANAGEMENT","REVOKED","STRIKING_OFF","STRUCK_OFF","GAZETTED_TO_BE_STRUCK_OFF","SUSPENDED","CONVERTED","DISSOLVED","CANCELLED","UNKNOWN_EXTERNAL"]},"shareholders":{"type":"array","description":"Each shareholder details","items":{"oneOf":[{"$ref":"#/components/schemas/BedrockPersonDetailsShareholderApiResponseDto"},{"$ref":"#/components/schemas/BedrockCompanyDetailsShareholderApiResponseDto"}]}},"founders":{"type":"array","description":"Deprecated: use shareholders instead","deprecated":true,"items":{"oneOf":[{"$ref":"#/components/schemas/BedrockPersonDetailsShareholderApiResponseDto"},{"$ref":"#/components/schemas/BedrockCompanyDetailsShareholderApiResponseDto"}]}},"bedrockShareBasisPoint":{"type":"number","description":"Share basis point allocated to Bedrock","example":2000},"category":{"type":"string","description":"Project category","example":"AI","enum":["RWA","AI","DEFI","INFRA","DEPIN","LEGAL","GAMING","NFT","MEME"],"nullable":true},"twitterHandle":{"type":"string","description":"Project Twitter handle","example":"example_handle","nullable":true},"createdAt":{"type":"string","description":"Date the project was created","example":"2024-01-01T00:00:00.000Z"},"preferredCompanyNames":{"description":"List of preferred company names in order of preference","example":["Alpha Holdings Ltd","Beta Ventures Ltd","Gamma Capital Ltd"],"type":"array","items":{"type":"string"}},"isReadyForIncorporation":{"type":"boolean","description":"Whether all shareholders have completed KYC verification and PEP forms, and the project is ready for incorporation","example":true}},"required":["companyId","companyName","tokenAddress","incorporationStatus","shareholders","bedrockShareBasisPoint","category","twitterHandle","createdAt","preferredCompanyNames","isReadyForIncorporation"]},"BedrockAttachTokenAddressApiRequestDto":{"type":"object","properties":{"blockchain":{"type":"string","description":"Blockchain the token address belongs to. Defaults to SOLANA.","enum":["SOLANA","BASE"],"example":"SOLANA"},"tokenAddress":{"type":"string","description":"Project token contract/program address","example":"METvsvVRapdj9cFLzq4Tr43xK4tAjQfwX76z3n6mWQL"}},"required":["tokenAddress"]},"BedrockAttachTokenAddressApiResponseDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the token address is now attached to the project","example":true},"tokenAddress":{"type":"string","description":"The attached token address, as stored","example":"METvsvVRapdj9cFLzq4Tr43xK4tAjQfwX76z3n6mWQL"},"blockchain":{"type":"string","description":"Blockchain the token address belongs to","enum":["ETHEREUM","BASE","HYPERLIQUID","BERACHAIN","SOLANA"]}},"required":["success","tokenAddress","blockchain"]},"BedrockStartIncorporationApiResponseDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether incorporation was started successfully","example":true}},"required":["success"]},"BedrockShareholderFormUrlApiResponseItemDto":{"type":"object","properties":{"type":{"type":"string","enum":["PERSON","COMPANY"],"example":"PERSON"},"shareholderId":{"type":"string","description":"ID of the shareholder (person or company record)","example":"123e4567-e89b-12d3-a456-426614174000"},"formUrl":{"type":"string","description":"Re-generated Bedrock form URL for this shareholder"}},"required":["type","shareholderId","formUrl"]},"BedrockFormUrlsApiResponseDto":{"type":"object","properties":{"shareholders":{"description":"Re-generated form URLs for each shareholder, except one matched to a person or company GVRN already holds or no longer this project's alone, whose link only ever reaches them by email","type":"array","items":{"$ref":"#/components/schemas/BedrockShareholderFormUrlApiResponseItemDto"}}},"required":["shareholders"]},"BedrockListApiResponseDto":{"type":"object","properties":{"limit":{"type":"number","description":"Maximum number of results to return","example":20},"offset":{"type":"number","description":"Number of results to skip for pagination","example":0},"total":{"type":"number","description":"Total number of available results matching the query","example":100},"result":{"description":"Array of Bedrock projects matching the query","type":"array","items":{"$ref":"#/components/schemas/BedrockDetailsApiResponseDto"}}},"required":["limit","offset","total","result"]}},"securitySchemes":{"x-bedrock-api-key":{"type":"apiKey","in":"header","name":"x-bedrock-api-key"}}},"security":[{"x-bedrock-api-key":[]}]}