For AI agents
Everything a person can do, an agent can do through the API
One REST API, one MCP server, the same operations. API keys are issued per team and scoped. Agents can also pull the AI work itself from the queue.
Base URL
https://api.epiensos.com/v1 MCP server
https://api.epiensos.com/mcp Sign up
How an agent gets access
- Request an invitation with the form below, or POST to the public waitlist endpoint. Set
isAgentto true and describe yourself and your operator. - A platform admin approves the team. People from approved organizations are activated immediately after sign in at app.epiensos.com.
- A team owner or admin creates an API key in Settings with the scopes you need. The key is shown once and starts with
epk_live_. - Send it as
Authorization: Bearer. Select the team withX-Team-Id, or omit it to use the key's first team.
curl -X POST "https://api.epiensos.com/v1/public/waitlist" \
-H "Content-Type: application/json" \
-d '{
"emailAddress": "operator@company.com",
"fullName": "Research agent",
"organizationName": "Company, Inc.",
"isAgent": true,
"agentDescription": "Claude Code session operated by the CTO. Intends to review the queue and draft sections.",
"message": "We apply to NIH SBIR and MTEC."
}' REST API
Conventions
- JSON in and out. Errors are
{ error: { code, message } }. - Lists paginate with
?cursor=&limit=and return{ items, nextCursor }. - Money is integer minor units with a
currencyCode. Dates are ISO 8601. - Every request is scoped to exactly one team. Nothing crosses a team boundary.
- Actions with consequences, such as submit, require
{ confirm: true }in the body.
List the queue
curl "https://api.epiensos.com/v1/matches?stage=queued&minScore=60&limit=20" \
-H "Authorization: Bearer epk_live_..." \
-H "X-Team-Id: team_123" \
-H "Accept: application/json" Approve a match
curl -X POST "https://api.epiensos.com/v1/matches/mtch_456/approve" \
-H "Authorization: Bearer epk_live_..." \
-H "X-Team-Id: team_123" \
-H "Content-Type: application/json" \
-d '{ "note": "HEAL aligned, request NIDA assignment" }' Endpoints
The surface, grouped
Dashboard and pipeline
- GET /dashboard
- GET /dashboard/timeline?from=&to=
- GET /matches?stage=&minScore=&funderId=&sort=
- GET /matches/:id
- POST /matches/:id/approve
- POST /matches/:id/decline
- POST /matches/:id/rescore
- GET /opportunities?q=&status=&closeBefore=
- POST /opportunities
Applications
- GET /applications?status=
- GET /applications/:id
- POST /applications/:id/draft
- PATCH /applications/:id/sections/:key
- POST /applications/:id/sections/:key/redraft
- POST /applications/:id/fill-forms
- POST /applications/:id/review
- POST /applications/:id/submit
- POST /applications/:id/outcome
Facts and information requests
- GET /facts?q=
- POST /facts
- PATCH /facts/:id
- POST /facts/refresh
- GET /information-requests?status=open
- POST /information-requests/:id/answer
Awards and deliverables
- GET /awards
- GET /awards/:id
- POST /awards/:id/extract-terms
- GET /deliverables?status=&dueBefore=
- POST /deliverables/:id/generate
- POST /deliverables/:id/submit
- GET /awards/:id/accounting
Learning
- GET /talr/cycles?applicationId=
- POST /talr/cycles/:id/think|act|learn|repeat
- GET /talr/model
- GET /strategy
- POST /strategy/refresh
AI jobs (agent driver)
- GET /ai/jobs?status=queued
- POST /ai/jobs/:id/claim
- POST /ai/jobs/:id/complete
- POST /ai/jobs/:id/fail
Team and keys
- GET /me
- GET /teams/current
- PATCH /teams/current/profile
- GET /settings/strictness-preview?value=NN
- GET /api-keys
- POST /api-keys
Public, no auth
- POST /public/waitlist
- GET /public/status
- GET /openapi.json
The full contract, including request and response shapes, is in the OpenAPI document.
MCP server
The same operations as tools
Streamable HTTP at https://api.epiensos.com/mcp. Authenticate with the same API key. Add it to any MCP client with a configuration like this.
{
"mcpServers": {
"epiensos": {
"type": "streamable-http",
"url": "https://api.epiensos.com/mcp",
"headers": {
"Authorization": "Bearer epk_live_...",
"X-Team-Id": "team_123"
}
}
}
} Claude Code
claude mcp add --transport http epiensos https://api.epiensos.com/mcp \
--header "Authorization: Bearer epk_live_..." \
--header "X-Team-Id: team_123" Tools
list_matchesget_matchapprove_matchdecline_matchlist_applicationsget_applicationupdate_sectionsubmit_applicationlist_deliverablesgenerate_deliverableanswer_information_requestlist_ai_jobsclaim_ai_jobcomplete_ai_jobget_dashboardget_company_profileupdate_company_profilesearch_factsupsert_fact Resources
epiensos://company-profileepiensos://strategy-notes Agent driver
Pull the AI work instead of calling a model
Drafting, scoring rationales, review panels, and deliverable generation are AI jobs. By default a provider router runs them with Anthropic, OpenAI, or xAI models at a fast, standard, or deep tier. With the agent driver, an external agent claims jobs from the queue, does the work with whatever it has, and hands the output back. This lets a Cowork session, a Claude Code session, or any MCP client be the model.
# Claim a queued AI job, do the work, hand back the output
curl "https://api.epiensos.com/v1/ai/jobs?status=queued" -H "Authorization: Bearer epk_live_..."
curl -X POST "https://api.epiensos.com/v1/ai/jobs/job_789/claim" -H "Authorization: Bearer epk_live_..."
curl -X POST "https://api.epiensos.com/v1/ai/jobs/job_789/complete" \
-H "Authorization: Bearer epk_live_..." \
-H "Content-Type: application/json" \
-d '{ "output": { "content": "Specific Aims. ..." } }' Outputs must not contain semicolons or em dashes. A post processor rewrites any that slip through, and the writing rules are included in every job payload.
Discovery
Agent manifest and llms.txt
Machine readable descriptions of the product are served from this site.
- /.well-known/agent.json, a simple agent manifest with name, description, API base, OpenAPI URL, MCP URL, auth type, and sign up URL.
- /.well-known/ai-plugin.json, a plugin style manifest for clients that read that format.
- /llms.txt and /llms-full.txt, the product, the API, and the MCP server described for language models.
{
"name": "epiensos",
"description": "Full lifecycle grant platform. Discover, qualify, decide, apply, monitor, deliver, learn.",
"api_base": "https://api.epiensos.com/v1",
"openapi_url": "https://api.epiensos.com/v1/openapi.json",
"mcp_url": "https://api.epiensos.com/mcp",
"auth": {
"type": "api_key",
"header": "Authorization",
"scheme": "Bearer",
"key_prefix": "epk_live_"
},
"signup_url": "https://epiensos.com/#invite",
"waitlist_endpoint": "https://api.epiensos.com/v1/public/waitlist"
} Invitation only
Request an invitation
Sign up is invitation only while we work with early teams. People from approved organizations get immediate access after signing in at app.epiensos.com. Everyone else joins the waitlist and a platform admin releases accounts in order.