By default a generation considers every connected source in a project. A SourceFilter narrows that down per source – useful when you only care about one repo, one branch, or one priority of issues.

filters is an object keyed by source. Each source accepts up to four arrays, AND-combined:

{
  "github": { "projects": ["acme/payments"], "branches": ["main"], "eventTypes": ["push"] },
  "linear": { "priorities": ["high"] }
}
FieldMeaning
projectsResource ids – repos, channels, boards.
branchesGit branch names (git sources only).
eventTypesEvent types to keep (e.g. push, issue_created).
prioritiesPriority values (e.g. high, urgent).

A source omitted from filters is left unconstrained. Within a source, the arrays combine with AND: a GitHub event must match a listed repo and a listed branch and a listed event type to be included.

Every field of a generation request is validated before any work is enqueued, so a malformed request can never quietly narrow the scope of a generation you are billed for. Flow Relay is strict where it can be certain and lenient where the value is provider-driven:

Hard-rejected with 400 (the response names the field and lists what is allowed):

  • An unknown source in sources or an unknown key in filters.
  • An unknown filter dimension (only projects, eventTypes, branches, priorities exist).
  • branches on a non-git source, or priorities on a source that has no priority concept.
  • Any unknown top-level field – the body must contain only the documented parameters.
  • Malformed shape: a non-array where an array is expected, an empty or over-long string, an out-of-range number.
{
  "error": "Invalid request: filters.slack.branches – Branch filtering is not supported for \"slack\". It applies to git sources only.",
  "issues": [
    {
      "field": "filters.slack.branches",
      "message": "Branch filtering is not supported for \"slack\". It applies to git sources only.",
      "allowed": ["github", "gitlab", "bitbucket", "azure_devops"]
    }
  ]
}

Matched leniently – the eventTypes, priorities and projects values come straight from the external platforms (a git host emits pr_<action> / mr_<action> directly), so an allow-list would be perpetually incomplete and would reject legitimate values. A value that does not exist simply matches no events; it is not rejected. Use GET /handoffs/filters to discover the values that actually apply to a project.

Because the request is validated up front and an over-restrictive filter short-circuits to a "no activity" outcome before the model runs, a rejected or empty-matching request never spends credits.

Do not guess filter values – fetch the real selectable options for a project with the filters endpoint:

curl "https://www.flowrelay.it/api/v1/handoffs/filters?project_id=3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer fr_your_api_key"
{
  "filters": {
    "github": {
      "projects": [{ "id": "acme/payments", "label": "acme/payments" }],
      "branches": [{ "value": "main", "label": "main" }],
      "eventTypes": [{ "value": "push", "label": "Push" }],
      "priorities": []
    }
  }
}

Use the id / value fields when building a SourceFilter. The filters endpoint only returns the sources actually connected to the project; the full closed vocabulary of every source is listed below.

Source vocabulary

The sources array and the keys of filters must be source ids from the table below – an unknown one is rejected with 400. branches applies to git sources only; priorities only to the sources that carry a priority – using either on a source that does not support it is a 400.

The eventTypes, priorities and projects values are provider-driven and matched leniently: a value that does not exist simply matches no events (it is not rejected). The lists below are the values Flow Relay recognizes for the picker; fetch GET /handoffs/filters for the exact set selectable on a given project.

Filter support per source

Source idprojects filterbranchespriorities
githubRepositoriesyesyes
slackChannels––
discordChannels––
linearTeams–yes
notionWorkspace––
jiraProjects–yes
gitlabProjectsyes–
bitbucketRepositoriesyes–
azure_devopsRepositoriesyes–
figmaFiles––
confluenceSpaces––
microsoft_outlookSenders––
microsoft_teamsChats––
sentryProjects–yes
datadogMonitors––
pagerdutyServices–yes
asanaProjects––
gmailSenders––
buildkitePipelines––
circleciProjects––
vercelProjects––
incident_ioIncident types–yes
netlifySites––
renderServices––
railwayProjects––
cloudflare_pagesProjects––
clickupSpaces–yes
monday_comBoards––
shortcutTeams––
intercomTeams––
zendeskGroups–yes
snykProjects–yes
firefliesOrganizers––
zoomOrganizers––
grafanaFolders–yes
google_calendarCalendars––
google_driveFiles––
launchdarklyProjects––
hcp_terraformWorkspaces––
sonarqubeProjects––
miroBoards––
new_relicAlert policies–yes
jira_service_managementService desks–yes
posthogProjects––
hubspotPipelines–yes
salesforceAccounts–yes
herokuApps––
alertmanagerReceivers–yes
pulumiStacks––
google_meetOrganizers––
microsoft_teams_meetingsOrganizers––
fathomOrganizers––

Event types

eventTypes values are case-sensitive Flow Relay identifiers, not the raw provider event names.

Source ideventTypes values
githubpushpr_openedpr_closedpr_reopenedpr_synchronizepr_editedpr_ready_for_reviewpr_converted_to_draftworkflow_successworkflow_failureworkflow_cancelleddeployment_successdeployment_failureissue_openedissue_closedissue_reopenedissue_editedissue_commentpr_commentpr_approvedpr_changes_requestedpr_review_commentedpr_review_dismissedpr_review_commentrelease_publisheddiscussion_createddiscussion_answereddiscussion_closeddiscussion_commentdependabot_alert_createddependabot_alert_fixeddependabot_alert_dismisseddependabot_alert_reopenedcode_scanning_alert_createdcode_scanning_alert_fixedcode_scanning_alert_dismissedcode_scanning_alert_reopenedsecret_scanning_alert_createdsecret_scanning_alert_resolvedsecret_scanning_alert_reopenedproject_item_createdproject_item_editedproject_item_convertedproject_item_archivedproject_item_restoredproject_item_deleted
slackmessageapp_mentionthread_replymessage_editedmessage_deletedreaction_addedreaction_removedpin_addedpin_removedfile_sharedmember_joinedmember_leftchannel_createdchannel_renamedchannel_archivedchannel_unarchived
discordmessage_createdmessage_updatedmessage_deletedreaction_addedreaction_removedchannel_createdchannel_updatedchannel_deletedthread_openedthread_updatedthread_deletedpins_updated
linearissue_createdissue_updatedissue_removedcomment_createdcomment_updatedcomment_removedproject_createdproject_updatedproject_removedproject_update_postedproject_update_editedcycle_createdcycle_updateddocument_createddocument_updatedlabel_createdreaction_addedreaction_removedinitiative_createdinitiative_updatedinitiative_update_posted
notionpage_createdpage_updatedpage_deletedpage_movedpage_properties_updatedpage_lockedpage_unlockedpage_restoredcomment_createdcomment_updatedcomment_deleted
jiraissue_createdissue_updatedissue_deletedcomment_createdcomment_updatedcomment_deletedproject_createdproject_updatedproject_deletedsprint_createdsprint_startedsprint_closedsprint_updatedsprint_deletedversion_createdversion_updatedversion_releasedversion_deletedworklog_createdworklog_updated
gitlabpushmr_openmr_closemr_mergemr_reopenmr_updatemr_approvedissue_openissue_closeissue_reopenissue_updatecomment_createdcomment_updatedpipeline_successpipeline_failedpipeline_canceledrelease_createdrelease_updateddeployment_successdeployment_faileddeployment_canceledtag_pushed
bitbucketpushpr_openedpr_updatedpr_mergedpr_declinedpr_approvedpr_commentpipeline_successpipeline_failedpipeline_stopped
azure_devopsgit.pushgit.pullrequest.createdgit.pullrequest.updatedgit.pullrequest.mergedgit.pullrequest.commentbuild.succeededbuild.partially_succeededbuild.failedbuild.canceledworkitem.createdworkitem.updatedworkitem.commentedworkitem.deletedworkitem.restored
figmacomment_addedversion_publishedfile_updatedfile_delete
confluencepage_createdpage_updatedpage_movedpage_removedcomment_created
microsoft_outlookemail_receivedcalendar_event_createdcalendar_event_updated
microsoft_teamsteams_messageteams_channel_message
sentryissue_createdissue_resolvedissue_ignoredissue_assignedissue_archivederrorevent_alertmetric_alert
datadogalert_triggeredalert_recoveredalert_no_dataalert_warn
pagerdutyincident_triggeredincident_acknowledgedincident_escalatedincident_resolvedincident_reassignedincident_annotatedincident_priority_updatedincident_reopenedincident_responder_added
asanatask_createdtask_updatedtask_deletedtask_removedtask_restoredcomment_added
gmailemail_received
buildkitebuild_passedbuild_failedbuild_canceled
circleciworkflow_successworkflow_failedworkflow_canceled
verceldeployment_succeededdeployment_errordeployment_canceleddeployment_promoted
incident_ioincident_createdincident_updatedincident_status_updated
netlifydeploy_succeededdeploy_faileddeploy_canceled
renderdeploy_succeededdeploy_faileddeploy_canceledbuild_failed
railwaydeployment_successdeployment_faileddeployment_crashed
cloudflare_pagesdeployment_successdeployment_faileddeployment_canceled
clickuptask_createdtask_updatedtask_deletedtask_status_updatedtask_priority_updatedtask_assignee_updatedtask_due_date_updatedtask_movedcomment_posted
monday_comitem_createdcolumn_value_updatedupdate_posteditem_deleteditem_archiveditem_name_updated
shortcutstory_createdstory_updatedstory_deletedcomment_createdcomment_updatedepic_createdepic_updatedepic_deletediteration_createditeration_updated
intercomconversation_createdconversation_user_repliedconversation_admin_repliedconversation_note_addedconversation_assignedconversation_closedconversation_reopenedconversation_snoozedconversation_unsnoozedconversation_ratedconversation_priority_updatedticket_createdticket_state_updated
zendeskticket_createdticket_status_changedticket_priority_changedticket_assignee_changedticket_group_changedticket_comment_addedticket_tags_changed
snykissues_foundissues_resolved
firefliesmeeting_transcribed
zoommeeting_transcribed
grafanaalert_firingalert_resolved
google_calendarcalendar_event_createdcalendar_event_updatedcalendar_event_cancelled
google_drivedocument_updated
launchdarklyflag_createdflag_updatedflag_archivedflag_deletedsegment_updated
hcp_terraformrun_needs_attentionrun_completedrun_errored
sonarqubequality_gate_passedquality_gate_failedanalysis_failed
miroboard_updated
new_relicissue_activatedissue_acknowledgedissue_closed
jira_service_managementrequest_createdrequest_updatedrequest_resolvedrequest_commentedrequest_deleted
posthogannotation_createdexperiment_launchedexperiment_concluded
hubspotdeal_createddeal_updateddeal_deletedticket_createdticket_updatedticket_deleted
salesforceopportunity_updatedcase_updated
herokudeploy_succeededdeploy_failedconfig_changedbuild_failed
alertmanageralert_firingalert_resolved
pulumiupdate_succeededupdate_faileddestroy_succeededdestroy_failedstack_createdstack_deletedpolicy_violation
google_meetmeeting_transcribed
microsoft_teams_meetingsmeeting_transcribed
fathommeeting_transcribed

Priorities

priorities values are lowercase.

Source idpriorities values
githubcriticalhighmediumlow
linearurgenthighmediumlownone
jirahighesthighmediumlowlowest
sentryfatalerrorwarninginfo
pagerdutyhighlow
incident_iocriticalmajorminor
clickupurgenthighnormallow
zendeskurgenthighnormallow
snykcriticalhighmediumlow
grafanacriticalhighwarninginfo
new_reliccriticalhighmediumlow
jira_service_managementhighesthighmediumlowlowest
hubspothighmediumlow
salesforcehighmediumlow
alertmanagercriticalhighwarninginfo

Only the main branch of one repo:

{ "filters": { "github": { "projects": ["acme/payments"], "branches": ["main"] } } }

Only high-priority Jira issues:

{ "filters": { "jira": { "priorities": ["high"] } } }

Filters apply identically to handoffs (POST /handoffs), insights and release notes (POST /projects/{id}/insights/{kind}) and project questions (POST /projects/{id}/qa, which narrows the activity the answer is grounded in). When you omit sources and filters entirely, the project's saved scope preferences are used.

Selecting figma (in sources or filters) does more than filter events: the generation attaches visual context – rendered previews of your team's top frames plus an indexed scene graph (layout, text content, prototype flows and, on Figma Enterprise, design variables).

Two constraints apply:

  • Global region only. Figma can be selected only on projects whose processing region is Global. On EU or self-hosted projects the API responds 400 and the dashboard shows Figma as non-selectable. Figma events still flow in as text when you don't filter for them explicitly.
  • Visual surcharge. A generation that attaches frame renders costs 1 extra credit on top of the flow's flat price. Text-only Figma activity carries no surcharge.

The filters endpoint returns a figma availability block alongside the options:

{
  "filters": { "...": {} },
  "figma": {
    "selectable": true,
    "region": "default",
    "scope": "personal",
    "canManageResidency": true,
    "residencyHref": "/projects/3fa85f64-5717-4562-b3fc-2c963f66afa6#data-residency"
  }
}

Check figma.selectable before offering Figma as a filter option in your own tooling.