Skip to Content
DevelopmentCreate Stakeholder

Create a Stakeholder

Stakeholders are the equity holders on your cap table — founders, employees, investors, or any entity that holds shares.

The primary /app flow calls createStakeholder from the connected ADMIN wallet, then saves the OCF metadata with POST /stakeholder/register-onchain after confirmation. The server-signed /stakeholder/create tutorial below is the API/automation alternative.

Minimal request

The smallest valid body identifies the issuer and the stakeholder’s name, type, and relationship:

{ "issuerId": "<YOUR_ISSUER_ID>", "data": { "name": { "legal_name": "Alex Palmer" }, "stakeholder_type": "INDIVIDUAL", "current_relationship": "FOUNDER" } }

Use the full request when you also want to capture contact details.

Send a POST request

Using Postman or curl, send a POST request to http://localhost:8293/stakeholder/create

Show full request with contact details
{ "issuerId": "<YOUR_ISSUER_ID>", "data": { "name": { "legal_name": "Alex Palmer", "first_name": "Alex", "last_name": "Palmer" }, "issuer_assigned_id": "", "stakeholder_type": "INDIVIDUAL", "current_relationship": "FOUNDER", "primary_contact": { "name": { "legal_name": "Alex Palmer", "first_name": "Alex", "last_name": "Palmer" }, "emails": [ { "email_type": "PERSONAL", "email_address": "alex@palmer.earth" } ], "phone_numbers": [ { "phone_type": "MOBILE", "phone_number": "+1 555-555-5555" } ] }, "contact_info": { "emails": [ { "email_type": "BUSINESS", "email_address": "alex@plume.org" } ], "phone_numbers": [ { "phone_type": "MOBILE", "phone_number": "+1 555-555-5555" } ] }, "comments": [] } }

Replace <YOUR_ISSUER_ID> with the _id from your issuer creation response.

Check the response

The response includes your new stakeholder. Keep _id; later issuances and transfers use it.

Show complete response
{ "stakeholder": { "_id": "<GENERATED_STAKEHOLDER_ID>", "object_type": "STAKEHOLDER", "name": { "legal_name": "Alex Palmer", "first_name": "Alex", "last_name": "Palmer" }, "stakeholder_type": "INDIVIDUAL", "issuer_assigned_id": "", "current_relationship": "FOUNDER", "primary_contact": { "name": { "legal_name": "Alex Palmer", "first_name": "Alex", "last_name": "Palmer" }, "emails": [ { "email_type": "PERSONAL", "email_address": "alex@palmer.earth" } ], "phone_numbers": [ { "phone_type": "MOBILE", "phone_number": "+1 555-555-5555" } ] }, "contact_info": { "emails": [ { "email_type": "BUSINESS", "email_address": "alex@plume.org" } ], "phone_numbers": [ { "phone_type": "MOBILE", "phone_number": "+1 555-555-5555" } ] }, "comments": [], "issuer": "<YOUR_ISSUER_ID>", "is_onchain_synced": false } }

The is_onchain_synced field starts as false. The event poller will update it to true once the blockchain confirms the transaction.

Required fields

FieldDescription
issuerIdIssuer _id from the Create an Issuer response.
data.name.legal_nameStakeholder’s full legal name. first_name/last_name are optional.
data.stakeholder_typeINDIVIDUAL or INSTITUTION.
data.current_relationshipRelationship enum (see below).
data.issuer_assigned_idOptional. Pass "" when you have no internal stakeholder ID yet — the field still appears on the record so you can update it later. Leaving it as "" is the convention used by mint-cap-table imports.

Stakeholder types

The stakeholder_type field accepts:

  • INDIVIDUAL — A person (founder, employee, advisor)
  • INSTITUTION — A company or entity (VC fund, corporate investor)

Relationship types

The current_relationship field accepts values like:

  • FOUNDER
  • EMPLOYEE
  • ADVISOR
  • BOARD_MEMBER
  • INVESTOR
  • FORMER_EMPLOYEE

What’s next?

Last updated on