The Bilateral API (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/AllianceBioversityCIAT/onecgiar_pr/llms.txt
Use this file to discover all available pages before exploring further.
/api/bilateral/*) is the authoritative typed payload surface for downstream consumers of CGIAR results. It is designed for bilateral funders, discovery portals, and BI dashboards that need stable, readable result data without going through the authenticated PRMS UI. The payload contract is maintained in onecgiar-pr-server/docs/bilateral-result-summaries.en.md; all shape changes must update that file’s change log.
/api/bilateral/* endpoints do not require a JWT. Authentication is enforced at the infrastructure perimeter (API Gateway / IP allowlist), not inside NestJS. Do not send an auth header — it is not read on this surface.Bilateral endpoints are also exempt from rate throttling. The global 100 req / 60 s throttle does not apply. Volume controls belong at the API Gateway / network layer.
Endpoints
All bilateral routes are mounted under/api/bilateral/.
List all results (paginated)
type discriminator, result_id, and a fully enriched data object that includes common core fields plus the type-specific summary for the result’s indicator family.
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number (1-based). |
limit | integer | 10 | Items per page. Maximum: 500. |
source | enum | — | Result (W1/W2 funded) or API (W3/Bilateral funded). |
portfolio | string | — | Portfolio acronym, e.g. P22, P25. |
phase_year | integer | — | Reporting year, e.g. 2025. |
result_type | enum | — | Result type name: Knowledge product, Innovation use, Innovation development, Capacity sharing for development, Policy change, Innovation Package, Other outcome, Other output, Impact contribution. |
status_id | integer | — | Workflow status id (1–7). |
status | enum | — | Editing, Quality Assessed, Submitted, Discontinued, Pending Review, Approved, Rejected. |
last_updated_from | ISO 8601 date | — | Filter by last-updated date range start. |
last_updated_to | ISO 8601 date | — | Filter by last-updated date range end. |
created_from | ISO 8601 date | — | Filter by created date range start. |
created_to | ISO 8601 date | — | Filter by created date range end. |
center | string | — | Leading center code or acronym, e.g. IRRI. |
initiative_lead_code | string | — | Initiative official_code; returns results where this initiative is the lead (role 1). |
search | string | — | Full-text search on result title. |
Get a single result
result_id. Response shape is identical to a single list entry.
Get all results (sync)
bilateral (boolean — restrict to results with linked bilateral projects) and type (result type discriminator string, e.g. knowledge_product).
Get all results (unfiltered)
limit results (default 10) with no pagination controls. Intended for quick sampling; use /api/bilateral/list for production consumers.
Response shape
The response is a raw array — it is not wrapped in the PRMS response envelope. Each element has the following top-level structure:Result type discriminator. One of:
knowledge_product, capacity_sharing, innovation_development, innovation_use, innovation_package, policy_change. Other types (e.g. other output, other outcome) may appear without a dedicated type-specific summary.Numeric primary key of the result row in PRMS.
Fully enriched result document. Contains common core fields (listed below) plus the type-specific
*_summary object for the result’s indicator family.Common fields on data
These fields are present for all or most result types.
Identity and lifecycle
Stable public-facing numeric code. Used in
pdf_link and prms_link URLs.Headline title of the result (bilateral-friendly name).
Long-form description of what was achieved and how.
Reporting year context — which reporting cycle this result belongs to.
Soft-delete / validity flag.
true means the record is current.Numeric workflow status id. See
obj_status for the human-readable form.{ result_status_id, status_name, status_description } — human-readable submission state, e.g. "Submitted".URL to the PRMS PDF/report view for this result code.
Deep link into the PRMS web UI full result editor.
ISO 8601 timestamp — when this record first entered PRMS.
ISO 8601 timestamp — last change to the result.
{ code, name, description } — where in the results chain this sits (output, outcome, etc.).{ code, name } — indicator family for display (e.g. "Innovation use").Per contributing initiative:
entity (official_code, name), initiative_role, toc_results[] with level, sub_entity, and result_name.{ official_code, name } — the main initiative that owns or leads this result.{ code, name, description } — geographic scope type (national, regional, multi-national, etc.).Region objects when the result applies to one or more broader geographic areas.
[{ code, name }] — ISO-style country entries.[{ code, name, acronym, is_lead }] — CGIAR centers involved; is_lead marks the lead center.{ lead_kind, id, code, name, acronym } — the lead entity. lead_kind is "center" or "partner". Identifiers use CLARISA ids, not internal PRMS join PKs.Non-CGIAR or additional partners when captured.
Bilateral grant / project summaries tied to this result.
Object with keys
gender, climate_change, nutrition, environmental_biodiversity, poverty. Each: tag_title (significance level text) and impact_area_names[] when applicable.[{ link, description }] — proof or references attached to the result.Present when
status_id is 2 (Quality Assessed) or 3 (Submitted): { id, created_date, comment, status, status_id, submitted_by: { user_id, first_name, last_name } }.Source enum string, e.g.
"Result".Funding / reporting stream label, e.g.
"W1/W2".{ first_name, last_name, email } — who created or owns the record in PRMS.Type-specific summaries
Each result type appends a summary object todata when type matches. Summaries use CLARISA ids for all referenced entities — never internal PRMS join PKs.
knowledge_product → data.knowledge_product_summary
Stable CGSpace / product handle — the only field in this summary. The full
result_knowledge_product_array tree is removed during bilateral enrichment and replaced by this slim object.innovation_development → data.innovation_development_summary
Covers the innovation profile (typology, readiness level, developers), anticipated user demand, budget lines, and a questionnaire block.
Key fields:
Short title of the innovation.
{ id, code, name, definition } — CLARISA innovation type.{ id, level, name, definition } — TRL-style readiness scale.Structured demand without internal ids:
actors[], organizations[], measures[].Budget rows:
{ current_year, next_year, kind_cash, is_determined, initiative: { id, official_code, name } }. initiative.id is the CLARISA initiative id.Budget rows:
{ in_cash, in_kind, kind_cash, is_determined, project: { id, short_name, full_name } }. project.id is the CLARISA project id.Budget rows:
{ kind_cash, in_cash, in_kind, is_determined, institutions_id, institution: { id, name, acronym, institution_type_name } }. institution.id is the CLARISA institution id.Four arrays of
{ question, question_id, answer, selected_sub_options? }: responsible_innovation_and_scaling, intellectual_property_rights, innovation_team_diversity, megatrends. Megatrends uses answer.selections[] (one entry per checked option). Portfolio P25 uses the V2 question catalog.innovation_use → data.innovation_use_summary
Current and 2030 use sections, innovation use level from CLARISA, links to other results, and budget lines (no reference materials or user-need evidence links — those are innovation development only).
{ id, level, name, definition } — evidence-based use level from CLARISA.Populated when
innov_use_to_be_determined is false: actors[], organizations[], other_quantitative[] for the reporting year.Populated when
innov_use_2030_to_be_determined is false: same shape as current_section for 2030 projections.capacity_sharing → data.capacity_development_summary
Male participant count (or
null).Female participant count (or
null).{ name, description } — resolved from the cap dev delivery methods catalog. No raw FK.{ name, term, description } — from the cap dev term catalog (length of training).[{ id, name, acronym, institution_type_name }] — implementing org rows. id is the CLARISA institution id.policy_change → data.policy_change_summary
{ id, name, definition } — CLARISA policy type.{ id, name, definition } — CLARISA policy stage.Policy-related USD amount when applicable, or
null."Confirmed", "Estimated", or "Unknown".[{ parent_question, option_text }] — options ticked under “Is this result related to”. Empty array when none.[{ id, name, acronym, institution_type_name }] — implementing orgs (PRMS role 4). id is the CLARISA institution id.innovation_package → data.ipsr_pathway_summary
The four IPSR pathway steps in one object. Any step may be null if its data could not be loaded.
Core innovation row,
specify_aspired_outcomes_impact, target_innovation_use (actors, organizations, other quantitative), scalig_ambition (note: spelled this way in the payload), and expert workshop participants.Complementary innovation rows. Each item carries
official_code (CLARISA initiative code) and result_type_name (human-readable) in place of the internal initiative_id and result_type_id.Scaling readiness assessment:
result_core_innovation, result_innovation_package (flags only), optional expert_workshop (assessed during, assessment mode, and conditional workshop_level_assignments), evidence_based_assessment with readiness/use levels per innovation, and target_innovation_use.Slim investments slice:
initiative_budget, bilateral_project_budget, partner_budget (same row shape as innovation development / innovation use), ipsr_materials, has_scaling_studies, scaling_studies_urls. Internal audit columns, pictures, and publish flags are omitted.Payload conventions
- Discriminator: always read
typeto determine which*_summarykey is present ondata. - Identifiers: all cross-entity references use CLARISA ids (
initiative.id,institution.id,project.id), never internal PRMS join PKs. - Field names:
camelCaseondataand all nested objects. - Array pass-through: the response is a raw array — there is no PRMS envelope (
response,statusCode,messagewrapper). - Additive changes: new fields are added without versioning. Breaking changes (field removals, renames, type changes) require a
v2rollout. - Null vs absent: missing optional objects are
null; missing optional arrays are[].
Reference JSON fragment
The following illustrates a representativedata object (values are examples only):
Change log
All payload changes are tracked inonecgiar-pr-server/docs/bilateral-result-summaries.en.md. Consult that file as the authoritative contract before building a consumer integration. The source implementation is bilateral.service.ts (enrichBilateralResultResponse and related builders).