Cookbook
Grant employee equity
Issue an ISO, NSO, RSU, or RSA grant against an authorized equity plan. Document rendered, signing envelope dispatched, share ledger updated on signature.
Last updated
Approve an option grant via board consent, generate the grant notice + stock option agreement, schedule cliff and vesting, and notify the employee.
Trigger
A new hire signed an offer letter that promises options. The board approved (or will approve) at the next consent.
Call sequence
1. Issue the grant (pending board)
POST /v1/grants { entity, holder, shares, exercise_price, vesting }2. Roll the grant into a board consent
POST /v1/board_consents { entity, actions: [{ kind: 'approve_option_grant', grant }] }3. Generate notice + agreement
POST /v1/documents { template: 'tpl_grant_iso_v2', subject: grant }4. Send to employee for signature
POST /v1/signing_envelopes { document, signers: [employee] }Idempotency
Grant creation is idempotent on `(entity, holder, shares, vesting.hash)`. Replays after board approval return the existing grant in `vested`-or-`vesting`.
Webhooks
| Event | Description |
|---|---|
grant.created | Grant in pending_board_approval. |
board_consent.signed | Grant flips to vesting. |
grant.signed | Employee signed. |
Errors
| Status | Code | Description |
|---|---|---|
422 | insufficient_pool | The pool has fewer remaining shares than requested. |
422 | 409a_stale | The 409A is older than 12 months. Refresh first. |
Related
Pre-flight
Grants only land on a live entity. draft and submitted entities
can't issue grants — finish formation first via
form-a-company.
equity_plan_id must reference an EquityPlan with
available_shares >= quantity. New entity? Run
adopt-an-equity-plan first — the
formation-time stub plan is not ISO-eligible until adopted by board
and stockholder consent under IRC §422.
valuation_id must reference a Valuation no older than 12 months for
iso and nso grants. ISOs additionally require strike_price ≥ valuation.fair_market_value_per_share for safe harbor. Stale or
superseded valuations return 409 valuation_stale — refresh first via
refresh-a-409a.
The recipient must already exist as a Stakeholder on the entity. Add via
POST /v1/entities/{id}/stakeholders — name, email, kind: natural_person, and (for ISOs) tax_residency: US plus an SSN/ITIN are
required for the agreement to render.
Error recovery
| Failure | Cause | Remediation |
|---|---|---|
409 plan_pool_exhausted | quantity exceeds the plan's available_shares. | Top up the pool via adopt-an-equity-plan Pattern 2 or amend via POST /v1/equity_plans/{id}/amendments. |
409 valuation_stale | ISO/NSO and the referenced valuation_id is older than 12 months or has been superseded_by_event. | Refresh via refresh-a-409a and retry with the new valuation_id. |
422 strike_below_fmv | ISO strike is less than the valuation's fair_market_value_per_share. | Bump strike to ≥ FMV. ISOs cannot be granted below FMV without a §409A violation (20% additional tax + interest on the optionee). |
422 plan_unauthorized_for_iso | Plan type: option_pool was adopted by board only — ISO eligibility requires stockholder approval per IRC §422. | Run an option_plan_stockholder_approval resolution; cross-link authorizing_resolution_id and retry with the same Idempotency-Key. |
412 stakeholder_missing_tax_id | ISO grants need an SSN/ITIN on file for §83(b) and Form 3921 reporting. | PATCH /v1/stakeholders/{id} to add tax_id. |
408 envelope_expired | Recipient didn't sign within 30 days. | Re-fire POST /v1/entities/{id}/grants with a new Idempotency-Key; original draft moves to voided. |
Full taxonomy at errors.
Variations
Non-qualified options. Looser tax treatment, available to non-employees. No ISO §422 adoption ceiling — board-only resolution is enough.
{
"stakeholder_id": "stk_advisor",
"equity_plan_id": "plan_4Vt6yJzH",
"kind": "nso",
"quantity": 10000,
"strike_price": {"amount": 42, "currency": "usd"},
"valuation_id": "val_5DwYsKjM",
"vesting_schedule": {"cliff_months": 0, "total_months": 24, "granularity": "monthly"},
"grant_date": "2026-04-25"
}Restricted stock units — no strike price, taxed on vest. Common at the post-Series-B stage when the FMV is high enough that option strikes are unaffordable for new hires.
{
"stakeholder_id": "stk_7Hpx9WxY",
"equity_plan_id": "plan_4Vt6yJzH",
"kind": "rsu",
"quantity": 5000,
"vesting_schedule": {
"cliff_months": 12,
"total_months": 48,
"granularity": "quarterly",
"double_trigger_acceleration": true
},
"grant_date": "2026-04-25"
}Restricted stock award — purchased at fair value on grant day, eligible for
an §83(b) election within 30 days. Most common for very early hires when the
strike price is still negligible. Set tax_election: "83b" and Matter
prepares + tracks the election filing automatically.
{
"stakeholder_id": "stk_FirstHire",
"equity_plan_id": "plan_4Vt6yJzH",
"kind": "rsa",
"quantity": 100000,
"strike_price": {"amount": 1, "currency": "usd"},
"vesting_schedule": {"cliff_months": 12, "total_months": 48, "granularity": "monthly"},
"grant_date": "2026-04-25",
"tax_election": "83b"
}Up to 250 grants in a single atomic call against
POST /v1/entities/{id}/grants/batch. Either every grant is accepted, or
none are; failures land on BatchResult.failures[] keyed by request index.
Use a single Idempotency-Key for the whole batch and supply
authorizing_resolution_id if a board has pre-approved the wave.
curl -X POST https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/grants/batch \
-H "Authorization: Bearer $MATTER_KEY" \
-H "Matter-Version: 2026-05-01" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"authorizing_resolution_id": "res_QA42026Wave",
"grants": [
{"stakeholder_id": "stk_NewHire01", "equity_plan_id": "plan_4Vt6yJzH",
"kind": "iso", "quantity": 25000,
"strike_price": {"amount": 42, "currency": "usd"},
"valuation_id": "val_5DwYsKjM",
"vesting_schedule": {"cliff_months": 12, "total_months": 48, "granularity": "monthly"},
"grant_date": "2026-04-25"},
{"stakeholder_id": "stk_NewHire02", "equity_plan_id": "plan_4Vt6yJzH",
"kind": "iso", "quantity": 30000,
"strike_price": {"amount": 42, "currency": "usd"},
"valuation_id": "val_5DwYsKjM",
"vesting_schedule": {"cliff_months": 12, "total_months": 48, "granularity": "monthly"},
"grant_date": "2026-04-25"}
]
}'Pre-flight the wave with ?dry_run=true to see the per-row validation
without consuming pool shares — the response surfaces every failures[]
entry as if you had called for real.
Advisor agreement vests differently — typically a 24-month linear schedule with no cliff, attached to a separate Advisor Agreement document. Use NSO (advisors aren't W-2 employees and can't receive ISOs).
{
"stakeholder_id": "stk_AdvisorBoard",
"equity_plan_id": "plan_4Vt6yJzH",
"kind": "nso",
"quantity": 8000,
"strike_price": {"amount": 42, "currency": "usd"},
"valuation_id": "val_5DwYsKjM",
"vesting_schedule": {"cliff_months": 0, "total_months": 24, "granularity": "monthly"},
"grant_date": "2026-04-25",
"agreement_template": "faast_advisor"
}The faast_advisor template uses Founder Institute's FAST agreement under
the hood. Substitute metadata.linked_advisor_agreement with a Document ID
if you maintain a custom advisor agreement.
FAQ
Related
- Adopt an equity plan — required precondition for issuing grants
- Refresh a 409A — refresh the FMV reference before grants stale
- Run a board consent — ratify grants with
kind: grant_approval - Impose retroactive vesting — layer vesting onto an already-issued grant
- Issue a priced round — the round close pattern that bundles grants + 409A refresh atomically
- Grants endpoint — single-grant primitive reference
- Grants batch endpoint — batch primitive reference