Skip to content

Pipeline Attribution Summary API Guide

This document is a guide for using the PartnerTap Analytics API for retrieving the Pipeline Attribution Summary report.

The Pipeline Attribution Summary report is the rollup view of the Pipeline Attribution Detail report. Each row aggregates attribution activity by top parent account + new opportunity, summarizing how much partner-influenced engagement (action lists, downloads, workflows, intros) drove a given new opportunity. Use this report to see, at a glance, the total attribution events and partners that contributed to each new opp.

All report endpoints follow the pattern /v1/report-analytics/report/{reportType}/... and support the ReportRequest body for filtering, searching, and column selection.


All API requests require an API key passed in the api-key HTTP header.

  1. Log in to PartnerTap.
  2. Navigate to Admin Center > Data > API Keys.
  3. Click “Generate Key”.
  4. Copy the generated key and store it securely — it will not be shown again.

Include the key in every request via the api-key header:

api-key: <YOUR_API_KEY>

If the api-key header is not provided, the service falls back to the standard authorization header (JWT bearer token). The API key approach is recommended for programmatic/external integrations.

Rate Limiting: Each API key is rate-limited to a maximum of 100 requests per minute. The counter resets on a rolling 1-minute window. If the limit is exceeded, the server responds with HTTP 429 Too Many Requests. The rate limit is tracked per API key — separate keys have independent counters.


Returns paginated report records for the Pipeline Attribution Summary report.

POST /v1/report-analytics/report/PIPELINE_ATTRIBUTION_SUMMARY/records?page=0&size=20&sort=columnName,asc
Content-Type: application/json
ParameterTypeRequiredDescription
reportTypestringYesMust be PIPELINE_ATTRIBUTION_SUMMARY
ParameterTypeRequiredDescription
pageintegerNoZero-based page index (default: 0)
sizeintegerNoNumber of records per page (default: 20, max: 2000)
sortstringNoSorting criteria in the format property,asc|desc. Multiple sort criteria are supported.
{
"filters": {},
"search": "",
"context": {
"partnerPublicIds": ["<PARTNER_ORG_UUID_1>", "<PARTNER_ORG_UUID_2>"],
"eventTypeCodes": ["ACTION_LIST", "WORKFLOW"],
"dateRangeDays": 30,
"oppCreatedDateDays": 90
}
}

Important: The context object is required. Without partnerPublicIds and eventTypeCodes, the API will return an error. Without a date scope, the report will run unbounded against the event and opportunity history. See Required Context Parameters below.

The Pipeline Attribution Summary report is scoped via the context object on the ReportRequest body. Use this object to declare which partners’ events drive the rollup, which event types to include, and the time windows for the underlying attribution events and the new opportunities.

KeyTypeRequiredDescription
partnerPublicIdsstring[]YesList of partner organization UUIDs to include. Obtain these from the All Partner Organizations report (the companyPartnerPublicId field). The request will fail if this key is missing or empty.
eventTypeCodesstring[]YesList of attribution event type codes to include. Use the /v1/attribution/event-types endpoint to retrieve the valid codes. The request will fail if this key is missing or empty.
dateRangeDaysintegerNoConvenience window — limits the attribution events rolled up to those that occurred within the last N days from now. Ignored when eventDateStart and eventDateEnd are both set.
eventDateStartstringNoInclusive lower bound of the event date window (epoch seconds, as a string). Must be paired with eventDateEnd. Takes precedence over dateRangeDays.
eventDateEndstringNoInclusive upper bound of the event date window (epoch seconds, as a string). Must be paired with eventDateStart. Takes precedence over dateRangeDays.
oppCreatedDateDaysintegerNoConvenience window — limits results to opportunities created within the last N days from now. Ignored when oppCreatedDateStart and oppCreatedDateEnd are both set.
oppCreatedDateStartstringNoInclusive lower bound of the opportunity-created window (epoch seconds, as a string). Must be paired with oppCreatedDateEnd. Takes precedence over oppCreatedDateDays.
oppCreatedDateEndstringNoInclusive upper bound of the opportunity-created window (epoch seconds, as a string). Must be paired with oppCreatedDateStart. Takes precedence over oppCreatedDateDays.

Date scoping rules (apply independently to the event date and the opportunity-created date):

  • If both *Start and *End are provided, an inclusive range filter is applied.
  • Else if *Days is provided, results are limited to the last N days from now.
  • Otherwise, no filter is applied on that date. For performance, always include a date scope on both.

Example with explicit ranges for both event date and opp-created date:

{
"filters": {},
"search": "",
"context": {
"partnerPublicIds": ["c1727859-692f-499e-8c2a-b1fa50aa1a65"],
"eventTypeCodes": ["ACTION_LIST", "WORKFLOW"],
"eventDateStart": "1722470400",
"eventDateEnd": "1725148800",
"oppCreatedDateStart": "1722470400",
"oppCreatedDateEnd": "1730419200"
}
}

200 OK — Returns a paginated response containing report records (showing only 1 record for this example).

{
"totalElements": 84,
"totalPages": 5,
"sort": {
"unsorted": true,
"sorted": false,
"empty": true
},
"first": true,
"last": false,
"number": 0,
"pageable": {
"pageNumber": 0,
"pageSize": 20,
"sort": {
"unsorted": true,
"sorted": false,
"empty": true
},
"offset": 0,
"unpaged": false,
"paged": true
},
"numberOfElements": 20,
"size": 20,
"empty": false,
"content": [
{
"top_parent_crm_account_name": "Example Logistics Group",
"opp_name": "Example Logistics — Q4 Expansion",
"opp_amount": 125000.00,
"opp_created_date": 1722705610,
"action_lists_created_count": 3,
"action_list_downloads_count": 8,
"workflows_initiated_count": 2,
"workflow_intros_completed_count": 1,
"total_attribution_events": 14,
"total_partners": 2,
"opp_stage_name": "Proposal/Price Quote",
"opp_close_date": 1733011200,
"opp_is_won": false
}
],
"noDataFoundMessage": null
}
Terminal window
curl -X POST \
"https://reports-analytics.partnertap.com/v1/report-analytics/report/PIPELINE_ATTRIBUTION_SUMMARY/records?page=0&size=20" \
-H "Content-Type: application/json" \
-H "api-key: <YOUR_API_KEY>" \
-d '{
"filters": {},
"search": "",
"context": {
"partnerPublicIds": ["c1727859-692f-499e-8c2a-b1fa50aa1a65"],
"eventTypeCodes": ["ACTION_LIST", "WORKFLOW"],
"dateRangeDays": 30,
"oppCreatedDateDays": 90
}
}'

Here are all of the standard fields for the Pipeline Attribution Summary report. If you have custom fields they will appear with the prefix “custom_” in the records response.

Note: Each row is aggregated by top parent account + new opportunity. Counter columns (*_count, total_*) are sums across all attribution events linked to that new opp. Columns prefixed with “opp_” describe the new opportunity (“NEW Opp”) that the events rolled up to.

API NameDisplay NameTypeDescription
top_parent_crm_account_nameTop Parent Account NamestringName of the top-level parent account in the account hierarchy
opp_nameNEW Opp NamestringName of the new opportunity influenced by partner activity
opp_amountNEW Opp AmountcurrencyAmount of the new opportunity
opp_created_dateNEW Opp Created DatedateDate the new opportunity was created (epoch seconds)
action_lists_created_countAction Lists CreatednumberNumber of action lists created that contributed to this new opportunity
action_list_downloads_countAction List DownloadsnumberNumber of action list downloads that contributed to this new opportunity
workflows_initiated_countWorkflows InitiatednumberNumber of workflows initiated that contributed to this new opportunity
workflow_intros_completed_countWorkflow Intros CompletednumberNumber of workflow intros completed that contributed to this new opportunity
total_attribution_eventsTotal Attribution EventsnumberTotal count of all attribution events rolled up into this new opportunity
total_partnersTotal PartnersnumberNumber of distinct partner organizations credited with attribution on this new opportunity
top_parent_crm_account_idTop Parent Account IDstringCRM ID of the top-level parent account in the account hierarchy
opp_crm_opportunity_idNEW Opp IDstringUnique identifier of the new opportunity in the source CRM
opp_crm_account_idNEW Opp Linked Account IDstringCRM account ID the new opportunity is linked to
opp_stage_nameNEW Opp StagestringStage of the new opportunity
opp_close_dateNEW Opp Close DatedateClose date of the new opportunity (epoch seconds)
opp_is_wonNEW Opp Is WonbooleanWhether the new opportunity is marked as won
opp_opportunity_typeNEW Opp TypestringType of the new opportunity
opp_is_closedNEW Opp Is ClosedbooleanWhether the new opportunity is closed
opp_opportunity_owner_nameNEW Opp Owner NamenameFull name of the new opportunity’s owner
opp_opportunity_owner_emailNEW Opp Owner EmailemailEmail of the new opportunity’s owner
opp_opportunity_owner_titleNEW Opp Owner TitletitleJob title of the new opportunity’s owner
opp_opportunity_owner_phoneNEW Opp Owner PhonephonePhone of the new opportunity’s owner
opp_last_modified_dateNEW Opp Last Modified DatedateLast modified date of the new opportunity (epoch seconds)
opp_account_nameNEW Opp Account NamestringAccount name on the new opportunity
opp_probabilityNEW Opp ProbabilitynumberWin probability percent for the new opportunity
opp_expected_revenueNEW Opp Expected RevenuecurrencyExpected revenue for the new opportunity
opp_pt_statusNEW Opp PT StatusstringPartnerTap status of the new opportunity

Filters are passed as key-value pairs in the filters object of the ReportRequest body. The key is the column name (as returned in the response content objects), and the value is a string that encodes the filter operation, using special suffixes and delimiters.

OperationSuffixValue FormatDescription
Exact match(none)value1-,-value2-,-value3Matches rows where the field equals any of the values (OR logic).
Not equal-!-value1-,-value2-!-Excludes rows matching any of the values (AND logic). NULLs are preserved.
Contains-?-search1-,-search2-?-Case-insensitive substring match. Row must contain all terms (AND logic).
Does not contain-^-exclude1-,-exclude2-^-Case-insensitive substring exclusion. Row must not contain any of the terms (AND logic).
Range<->min<->maxMatches rows where the field value falls between min and max (inclusive).

Use -,- to separate multiple values within a single filter:

"opp_stage_name": "Proposal/Price Quote-,-Negotiation/Review"

This matches rows where opp_stage_name is “Proposal/Price Quote” OR “Negotiation/Review”.

Column TypeExact MatchNot EqualContainsDoes Not ContainRange
StringYYYY
BooleanY
UUIDYYYY
DateY
Number (int)Y
Currency / DoubleY

String / UUID — pass the display value as a string:

{
"opp_stage_name": "Closed Won"
}
{
"opp_stage_name": "Proposal/Price Quote-,-Negotiation/Review"
}
{
"top_parent_crm_account_name": "Example-?-"
}
{
"top_parent_crm_account_name": "Test-^-"
}
{
"opp_stage_name": "Closed Lost-!-"
}

Boolean — pass "true" or "false":

{
"opp_is_won": "true"
}

Date — pass epoch timestamps (seconds) as a range:

{
"opp_created_date": "1700000000<->1760000000"
}

Number / Currency — pass numeric values as a range:

{
"total_attribution_events": "5<->50"
}
{
"opp_amount": "100000<->500000"
}

Before building a filter, you can use the /filterdata endpoint to retrieve the available values for any column. This is a paginated endpoint — pass the column name as the filterField query parameter.

POST /v1/report-analytics/report/PIPELINE_ATTRIBUTION_SUMMARY/filterdata?filterField={columnName}

For string columns, the response contains the distinct values you can use in an exact-match or contains filter. For numeric/date columns, the response includes filterRangeMin and filterRangeMax to help you build a range filter.

Page size: The default page size is 20. You can request up to 2000 results per page by setting the size query parameter (e.g. size=200).

Example: get available values for opp_stage_name:

Terminal window
curl -X POST \
"https://reports-analytics.partnertap.com/v1/report-analytics/report/PIPELINE_ATTRIBUTION_SUMMARY/filterdata?filterField=opp_stage_name&page=0&size=10" \
-H "Content-Type: application/json" \
-H "api-key: <YOUR_API_KEY>" \
-d '{}'

Response:

{
"totalElements": 7,
"totalPages": 1,
"number": 0,
"size": 10,
"content": [
{
"filterData": "Prospecting",
"filterRangeMin": null,
"filterRangeMax": null,
"filterType": "STRING"
},
{
"filterData": "Proposal/Price Quote",
"filterRangeMin": null,
"filterRangeMax": null,
"filterType": "STRING"
}
]
}

You can then take a filterData value from the response and use it directly in a /records filter:

{
"filters": {
"opp_stage_name": "Proposal/Price Quote"
}
}

Example: get range bounds for total_attribution_events:

Terminal window
curl -X POST \
"https://reports-analytics.partnertap.com/v1/report-analytics/report/PIPELINE_ATTRIBUTION_SUMMARY/filterdata?filterField=total_attribution_events&page=0&size=1" \
-H "Content-Type: application/json" \
-H "api-key: <YOUR_API_KEY>" \
-d '{}'

Response:

{
"totalElements": 1,
"content": [
{
"filterData": null,
"filterRangeMin": 1,
"filterRangeMax": 120,
"filterType": "NUMBER"
}
]
}

Use the min/max to build a range filter:

{
"filters": {
"total_attribution_events": "5<->50"
}
}

All filters in the filters object are combined with AND logic:

{
"filters": {
"opp_stage_name": "Closed Won",
"total_partners": "2<->10",
"opp_amount": "100000<->500000"
}
}

This returns rows where the new opp is in “Closed Won”, contributed to by 2-10 partners, with an amount between $100K-$500K.

Example: Filtering Won New Opps with Multi-Partner Influence

Section titled “Example: Filtering Won New Opps with Multi-Partner Influence”
Terminal window
curl -X POST \
"https://reports-analytics.partnertap.com/v1/report-analytics/report/PIPELINE_ATTRIBUTION_SUMMARY/records?page=0&size=20" \
-H "Content-Type: application/json" \
-H "api-key: <YOUR_API_KEY>" \
-d '{
"filters": {
"opp_is_won": "true",
"total_partners": "2<->20",
"opp_created_date": "1700000000<->1760000000"
}
}'

EndpointMethodDescription
/v1/report-analytics/report/PIPELINE_ATTRIBUTION_SUMMARY/columnsPOSTGet available columns for the report
/v1/report-analytics/report/PIPELINE_ATTRIBUTION_SUMMARY/filterdataPOSTGet filter values for a column
/v1/attribution/event-typesGETList the valid eventTypeCodes to use in context
/v1/channelecosystem/recordsPOSTList your connected partners; use the companyPartnerPublicId values in context.partnerPublicIds. See All Partner Organizations.