---
# === IDENTITY ===
id: business/erp-integration/oracle-bi-publisher-as-data-source/2026
canonical_question: "When should you use Oracle BI Publisher reports as a data extraction mechanism vs BICC or REST?"
aliases:
  - "Oracle BIP data extraction vs BICC"
  - "BI Publisher report as data source for integration"
  - "Oracle Analytics Publisher extraction patterns"
  - "When to use BIP vs BICC vs REST for Oracle Fusion data"
entity_type: erp_integration
domain: business > erp-integration > oracle-bi-publisher-as-data-source
region: global
jurisdiction: global
temporal_scope: 2025-2026

# === SYSTEM PROFILE ===
systems:
  - name: "Oracle Fusion Cloud Applications (ERP, HCM, SCM)"
    vendor: "Oracle"
    version: "Release 25A/25B"
    edition: "Enterprise"
    deployment: cloud
    api_surface: "SOAP + REST (Report Service)"

# === VERIFICATION ===
last_verified: 2026-03-09
confidence: 0.87
version: 1.0
first_published: 2026-03-09

# === TEMPORAL VALIDITY ===
temporal_validity:
  status: volatile
  last_breaking_change: "24C — Oracle rebranded BI Publisher as Oracle Analytics Publisher; SOAP endpoints unchanged"
  next_review: 2026-09-05
  change_sensitivity: high

# === CONSTRAINTS ===
constraints:
  - "BIP is a reporting tool, NOT a bulk extraction tool — Oracle explicitly marks using BIP for data extraction as an unsupported pattern"
  - "Synchronous runReport SOAP calls time out at 240 seconds — anything exceeding this fails silently or returns a SOAP fault"
  - "Memory guards enforced: BIP limits in-memory data processing to prevent server-wide impact — BICC has no such guardrails"
  - "Report output returned as base64-encoded bytes in SOAP response — doubles memory footprint vs raw payload"
  - "No native incremental/CDC support — you must build date-range parameter filtering manually"
  - "Concurrent BIP report executions share the BI domain thread pool — heavy extraction degrades reporting for all users"

# === SKIP CONDITIONS ===
skip_this_unit_if:
  - condition: "Need bulk extraction of >100K records from ERP/SCM/CX"
    use_instead: "business/erp-integration/oracle-bicc-data-extraction/2026"
  - condition: "Need real-time individual record CRUD operations"
    use_instead: "business/erp-integration/oracle-erp-cloud-rest-api-capabilities/2026"
  - condition: "Need event-driven integration with Oracle ERP Cloud"
    use_instead: "business/erp-integration/oracle-erp-cloud-business-events/2026"

# === AGENT HINTS ===
inputs_needed:
  - key: integration_pattern
    question: "What integration pattern do you need?"
    type: choice
    options:
      - "real-time sync (individual records, <1s latency)"
      - "batch/bulk (scheduled, high volume)"
      - "event-driven (webhook, CDC, platform events)"
      - "file-based (CSV/XML import/export)"
  - key: data_volume
    question: "What's your daily data volume?"
    type: choice
    options:
      - "< 1,000 records/day"
      - "1,000-100,000 records/day"
      - "> 100,000 records/day"
  - key: direction
    question: "What's the data flow direction?"
    type: choice
    options:
      - "inbound (writing to this ERP)"
      - "outbound (reading from this ERP)"
      - "bidirectional sync"

# === DISTRIBUTION ===
canonical_source: "https://knowledgelib.io/business/erp-integration/oracle-bi-publisher-as-data-source/2026"
suggested_citation: "Source: knowledgelib.io — AI Knowledge Library (verified 2026-03-09)"

# === RELATED UNITS ===
related_kos:
  depends_on: []
  related_to:
    - id: "business/erp-integration/oracle-bicc-data-extraction/2026"
      label: "Oracle BICC bulk data extraction — 5GB silent truncation, 4-hour minimum extract interval, ExtractPVO scheduling"
    - id: "business/erp-integration/oracle-erp-cloud-rest-api-capabilities/2026"
      label: "Oracle ERP Cloud (Fusion) REST API capabilities — 499-record pagination, expand vs fields, CRUD"
  solves: []
  alternative_to:
    - id: "business/erp-integration/oracle-bicc-data-extraction/2026"
      label: "Oracle BICC bulk data extraction — 5GB silent truncation, 4-hour minimum extract interval, ExtractPVO scheduling"

# === SOURCES ===
sources:
  - id: src1
    title: "Data Extraction Options and Guidelines for Oracle Fusion Applications Suite"
    author: Oracle A-Team
    url: https://www.ateam-oracle.com/data-extraction-options-and-guidelines-for-oracle-fusion-applications-suite
    type: technical_blog
    published: 2024-06-15
    reliability: high
  - id: src2
    title: "Using Synchronous BIP for Extracting Data? Don't"
    author: Oracle A-Team
    url: https://www.ateam-oracle.com/using-synchronous-bip-for-extracting-data-dont
    type: technical_blog
    published: 2023-11-20
    reliability: high
  - id: src3
    title: "Extract data from Fusion Application using BI Publisher in OCI Data Integration"
    author: Oracle Cloud Infrastructure
    url: https://blogs.oracle.com/cloud-infrastructure/post/extract-data-from-fusion-application-using-bi-publisher-in-oci-di
    type: technical_blog
    published: 2024-03-10
    reliability: high
  - id: src4
    title: "Oracle BI Publisher Web Services Data Types"
    author: Oracle
    url: https://docs.oracle.com/cd/E23943_01/bi.1111/e22259/datatypes.htm
    type: official_docs
    published: 2024-01-15
    reliability: authoritative
  - id: src5
    title: "Call Oracle Fusion Applications BI Publisher Report Services"
    author: Oracle
    url: https://docs.oracle.com/en/cloud/paas/application-integration/soap-adapter/call-oracle-fusion-applications-business-intelligence-publisher-report-services.html
    type: official_docs
    published: 2024-08-01
    reliability: authoritative
  - id: src6
    title: "Oracle Fusion Applications using Oracle Business Intelligence Publisher (BIP) — OCI Data Integration"
    author: Oracle
    url: https://docs.oracle.com/en-us/iaas/data-integration/using/data-assets-create-fusion-applications-bip.htm
    type: official_docs
    published: 2025-01-10
    reliability: authoritative
  - id: src7
    title: "Creating the BI Publisher Report Extract (Async EPM Pattern)"
    author: Oracle
    url: https://docs.oracle.com/en/cloud/saas/enterprise-performance-management-common/diepm/integrations_erp_async_publisher.html
    type: official_docs
    published: 2024-09-01
    reliability: authoritative
---

# Oracle BI Publisher as Data Source: When to Use BIP vs BICC vs REST

## TL;DR

- **Bottom line**: Use BIP for targeted, small-to-medium data pulls where an existing report already covers your data model; use BICC for bulk extraction and REST for real-time transactional operations. BIP data extraction is an unsupported pattern per Oracle — wrap it in an ESS job if you must.
- **Key limit**: Synchronous runReport times out at 240 seconds; memory guards cap in-process data volume — there is no workaround for truly large datasets.
- **Watch out for**: Using synchronous SOAP calls for extraction — they consume BI domain thread pool capacity, degrade reporting for all users, and fail silently on large datasets.
- **Best for**: Extracting structured data from pre-built Fusion reports (AP, AR, GL, HCM) that already exist and return under 50K rows, where BICC does not expose the required view objects.
- **Authentication**: Username/password in SOAP header (ExternalReportWSSService) or payload (ReportService); OAuth not natively supported for SOAP — use basic auth or Oracle Identity Cloud Service federation.

## System Profile

Oracle BI Publisher (rebranded as Oracle Analytics Publisher in 24C) is the embedded reporting engine in Oracle Fusion Cloud Applications. It sits atop Oracle Transactional Business Intelligence (OTBI) data models and can generate output in PDF, CSV, XML, Excel, and HTML. While designed for formatted reporting, BIP is frequently used as a data extraction mechanism because it can reach Fusion data that BICC view objects do not expose. This card covers Oracle Fusion Cloud SaaS deployments (ERP, HCM, SCM, CX) running Release 25A/25B. It does not cover on-premise BI Publisher Server 12c standalone installations, which have different configuration and no ESS integration.

| Property | Value |
|---|---|
| **Vendor** | Oracle |
| **System** | Oracle Fusion Cloud Applications (ERP, HCM, SCM) + BI Publisher |
| **API Surface** | SOAP (ReportService, ScheduleService) + REST (v1/reports) |
| **Current API Version** | v2 (SOAP), v1 (REST) |
| **Editions Covered** | Enterprise (all Fusion Cloud SKUs include BIP) |
| **Deployment** | Cloud (SaaS) |
| **API Docs URL** | [BI Publisher Web Services](https://docs.oracle.com/cd/E23943_01/bi.1111/e22259/webservices.htm) |
| **Status** | GA — but data extraction pattern is officially unsupported |

## API Surfaces & Capabilities

| API Surface | Protocol | Best For | Max Records/Request | Timeout | Real-time? | Bulk? |
|---|---|---|---|---|---|---|
| SOAP ReportService (runReport) | HTTPS/XML, base64 response | Small reports <50K rows, synchronous | Memory-guarded (no fixed limit) | 240s | Yes | No |
| SOAP ExternalReportWSSService | HTTPS/XML, WS-Security headers | Same as ReportService, more secure auth | Same as ReportService | 240s | Yes | No |
| SOAP ScheduleService | HTTPS/XML | Scheduling reports, retrieving completed output | N/A (async) | None (async) | No | Partial |
| REST v1/reports/{path}/run | HTTPS/JSON + multipart | Ad-hoc report execution | Same as SOAP | 240s | Yes | No |
| ESS Job (BIPJobType) | Oracle Enterprise Scheduler | Large extractions via async execution | No hard cap | None (async) | No | Yes |
| OCI Data Integration BIP Connector | REST + Object Storage staging | ETL pipelines, incremental loads | Report-dependent | Configurable | No | Yes |

[src4, src5, src6]

## Rate Limits & Quotas

### Per-Request Limits

| Limit Type | Value | Applies To | Notes |
|---|---|---|---|
| Synchronous timeout | 240 seconds | runReport (SOAP and REST) | Request fails with SOAP fault after timeout; no partial results returned |
| Memory guard | Server-enforced (no published limit) | All BIP report execution | Oracle enforces in-memory caps to protect shared BI domain — exact threshold varies by pod |
| Base64 response overhead | ~33% size inflation | SOAP responses | Report bytes are base64-encoded — a 100MB CSV becomes ~133MB in the SOAP envelope |
| Max concurrent BI threads | Shared pool (typically 10-25 threads) | All BIP operations per pod | Heavy extraction competes with interactive reporting users |
| sizeOfDataChunkDownload | Configurable (integer, -1 = all) | ReportRequest parameter | Use chunking for large outputs; -1 attempts to return entire report in single response |

[src2, src4]

### Rolling / Daily Limits

| Limit Type | Value | Window | Notes |
|---|---|---|---|
| API call limit | No published per-user limit | N/A | Oracle does not enforce per-user API call caps on BIP SOAP/REST — but shared thread pool acts as a natural throttle |
| ESS concurrent jobs | Pod-dependent (typically 16-32 threads) | Per ESS domain | Heavy BIP ESS jobs reduce available threads for other scheduled processes |
| Report scheduling | No hard limit on schedule count | N/A | But Oracle recommends max 20 jobs per job set to reduce complexity |
| UCM storage | Subject to UCM quotas | Per Fusion pod | Async report output stored in UCM has retention policies |

[src1, src7]

## Authentication

| Flow | Use When | Token Lifetime | Refresh? | Notes |
|---|---|---|---|---|
| SOAP WS-Security (username token) | Server-to-server, recommended | Session-based | Per-request credentials | Use ExternalReportWSSService — credentials in SOAP header, not body |
| SOAP payload credentials | Legacy, simple integrations | Per-request | No | ReportService v2 — credentials embedded in SOAP body; less secure |
| REST Basic Auth | Ad-hoc REST report execution | Per-request | No | Base64-encoded username:password in Authorization header |
| IDCS/OCI IAM federation | Enterprise SSO integrations | Token-based (configurable) | Yes | Requires IDCS configuration; not native to BIP SOAP services |

[src4, src5]

### Authentication Gotchas

- BIP SOAP services do NOT support OAuth 2.0 natively — if your middleware requires OAuth, you need an API gateway or OIC adapter as a proxy [src5]
- The ExternalReportWSSService (WS-Security headers) is the recommended approach for synchronous calls, but many integration platforms default to the less-secure ReportService with payload credentials — explicitly choose the WSS variant [src5]
- Integration user accounts should have the BI Consumer and BI Author roles at minimum — missing roles cause cryptic "access denied" errors that look like connectivity failures [src1]

## Constraints
<!-- Agents: read this section before recommending any integration approach from this unit.
     These are hard constraints that must not be violated. -->

- Using Oracle Analytics Publisher to extract data from Oracle Fusion Applications is an **unsupported pattern** per Oracle A-Team guidance — always check if BICC or REST can fulfill the requirement first [src1]
- Synchronous runReport has a hard 240-second timeout with no configuration override in Fusion Cloud SaaS — if your report takes longer, it will fail [src2]
- Memory guards are enforced server-side — unlike BICC, BIP cannot process arbitrarily large datasets; exact thresholds are not published and vary by pod [src2]
- Report output is base64-encoded in SOAP responses, roughly doubling memory requirements on the client side — plan for 2x the expected output size [src4]
- BIP shares the BI server domain thread pool with interactive reporting users — high-volume extraction degrades reporting performance for all Fusion users in the pod [src2]
- No built-in Change Data Capture (CDC) — incremental extraction requires manually parameterizing reports with date range filters (LAST_UPDATE_DATE >= :p_from_date) [src1]

## Integration Pattern Decision Tree

```
START — Need to extract data from Oracle Fusion Cloud
|
+-- Is the data available via BICC view objects?
|   +-- YES --> Use BICC (bulk extraction, incremental support, no timeout risk)
|   +-- NO --> Continue
|
+-- Is the data available via REST API?
|   +-- YES, and volume < 1K records/day --> Use REST API (real-time, transactional)
|   +-- YES, but volume > 1K records/day --> Use REST API with pagination + scheduling
|   +-- NO --> Continue (BIP may be your only option)
|
+-- Does an existing BIP report cover the required data?
|   +-- YES --> Continue with BIP extraction approach
|   +-- NO --> Create custom BIP report (requires BI Author role + data model access)
|
+-- What's the expected data volume?
|   +-- < 10K rows --> Synchronous runReport via SOAP/REST
|   +-- 10K-50K rows --> ESS Job (BIPJobType) — async, no timeout
|   +-- 50K-500K rows --> ESS Job with chunked date ranges + pagination
|   +-- > 500K rows --> STOP — BIP is wrong tool; escalate to Oracle for BICC VO coverage
|
+-- Scheduling requirements?
|   +-- One-time or ad-hoc --> SOAP runReport or REST v1/reports/{path}/run
|   +-- Recurring --> ESS Job scheduled via Fusion Scheduled Processes UI
|   +-- ETL pipeline --> OCI Data Integration BIP Connector (stages to Object Storage)
|
+-- Output format?
    +-- Raw data for downstream processing --> CSV or XML (data format)
    +-- Need formatted output --> PDF, Excel, HTML
    +-- Need field-level parsing --> XML (preserves data types and structure)
```

## Quick Reference

### BIP vs BICC vs REST — Decision Matrix

| Criterion | BI Publisher | BICC | REST API |
|---|---|---|---|
| **Primary purpose** | Reporting | Bulk data extraction | Transactional CRUD |
| **Oracle's recommendation** | Use for reporting only | Primary extraction tool | Real-time operations |
| **Extraction support** | Unsupported (but functional) | Fully supported | Supported (low volume) |
| **Max practical volume** | ~50K rows per report | Millions of rows | ~1K records per request |
| **Incremental extraction** | Manual (date parameter) | Built-in (CDC/delta) | Manual (filter by date) |
| **Timeout risk** | High (240s sync limit) | None (async) | Low (paginated) |
| **Output formats** | CSV, XML, Excel, PDF, HTML | CSV (Object Storage) | JSON |
| **Async support** | Via ESS job wrapper | Native | No (sync only) |
| **Thread pool impact** | Shares with interactive BI | Dedicated extraction threads | Dedicated REST threads |
| **Data coverage** | Any data model with BIP report | Limited to published VOs | Limited to REST-enabled objects |
| **Scheduling** | ESS/ScheduleService | Built-in BICC scheduling | External orchestration |
| **Third-party connector support** | Fivetran, Celonis, OCI DI | OCI DI, most iPaaS | Most iPaaS platforms |
| **When to use** | Data not in BICC, <50K rows | Bulk/warehouse loads | Real-time, <1K records/day |

[src1, src2, src3]

## Step-by-Step Integration Guide

### 1. Identify the correct BIP report path

Before calling any API, locate the report in the Fusion BI catalog. Navigate to Tools > Reports and Analytics in Oracle Fusion, find the report, and note its absolute path (e.g., /Custom/Financials/AP Invoice Extract.xdo). [src4]

```bash
# Report paths follow this pattern:
# /shared/{module}/{report_name}.xdo   (seeded Oracle reports)
# /Custom/{module}/{report_name}.xdo   (custom reports)
# Example: /Custom/Financials/AP_Invoice_Listing.xdo
```

**Verify**: Confirm the report runs manually in Fusion UI with expected parameters and output before automating.

### 2. Authenticate and run report via SOAP (synchronous)

Use the ExternalReportWSSService for secure authentication with credentials in the SOAP header. [src5]

```xml
<!-- SOAP Envelope for ExternalReportWSSService runReport -->
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:pub="http://xmlns.oracle.com/oxp/service/PublicReportService">
  <soapenv:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:UsernameToken>
        <wsse:Username>INTEGRATION_USER</wsse:Username>
        <wsse:Password>PASSWORD</wsse:Password>
      </wsse:UsernameToken>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body>
    <pub:runReport>
      <pub:reportRequest>
        <pub:attributeFormat>csv</pub:attributeFormat>
        <pub:attributeTemplate>default</pub:attributeTemplate>
        <pub:reportAbsolutePath>/Custom/Financials/AP_Invoice_Listing.xdo</pub:reportAbsolutePath>
        <pub:parameterNameValues>
          <pub:listOfParamNameValues>
            <pub:item>
              <pub:name>p_from_date</pub:name>
              <pub:values><pub:item>2026-01-01</pub:item></pub:values>
            </pub:item>
            <pub:item>
              <pub:name>p_to_date</pub:name>
              <pub:values><pub:item>2026-03-09</pub:item></pub:values>
            </pub:item>
          </pub:listOfParamNameValues>
        </pub:parameterNameValues>
      </pub:reportRequest>
    </pub:runReport>
  </soapenv:Body>
</soapenv:Envelope>
```

**Verify**: HTTP 200 response with `<reportBytes>` element containing base64-encoded report output.

### 3. Decode the base64 response

The SOAP response wraps report output in base64 encoding. Decode it to obtain the actual CSV/XML/Excel file. [src4]

```python
import base64
from lxml import etree

# Parse SOAP response
tree = etree.fromstring(soap_response_bytes)
ns = {'pub': 'http://xmlns.oracle.com/oxp/service/PublicReportService'}
report_bytes_b64 = tree.find('.//pub:reportBytes', ns).text

# Decode base64 to raw file content
raw_output = base64.b64decode(report_bytes_b64)

# Write to file (CSV in this case)
with open('ap_invoices.csv', 'wb') as f:
    f.write(raw_output)
```

**Verify**: `wc -l ap_invoices.csv` returns expected row count; `head -5 ap_invoices.csv` shows proper CSV headers.

### 4. Switch to async ESS job for large datasets

For reports exceeding 10K rows or taking >60 seconds, register the BIP report as an ESS job of type BIPJobType. This eliminates the 240-second timeout. [src2, src7]

```
Steps to register BIP report as ESS job:
1. Navigate to Setup and Maintenance > Manage Enterprise Scheduler Jobs
2. Create new job definition:
   - Job Type: BIPJobType
   - Report ID: /Custom/Financials/AP_Invoice_Listing.xdo
   - Output format: CSV (or XML)
3. Define parameters matching the BIP report parameters
4. Submit job via Scheduled Processes UI or ERP Integration Service SOAP
5. Poll job status via ESS REST API or getDocumentData SOAP call
6. Download output from UCM or Object Storage
```

**Verify**: Job status = "Succeeded" in Scheduled Processes monitor; output file available in UCM or configured Object Storage bucket.

### 5. Implement date-range chunking for incremental loads

Since BIP has no native CDC, implement manual incremental extraction using date parameters. [src1]

```python
# Input:  BIP report with p_from_date and p_to_date parameters
# Output: Incremental CSV files per date chunk

from datetime import datetime, timedelta

def generate_date_chunks(start_date, end_date, chunk_days=7):
    """Split date range into chunks to avoid BIP memory limits."""
    chunks = []
    current = start_date
    while current < end_date:
        chunk_end = min(current + timedelta(days=chunk_days), end_date)
        chunks.append((current.strftime('%Y-%m-%d'),
                       chunk_end.strftime('%Y-%m-%d')))
        current = chunk_end
    return chunks

# Example: extract last 90 days in 7-day chunks
chunks = generate_date_chunks(
    datetime(2026, 1, 1),
    datetime(2026, 3, 9),
    chunk_days=7
)
# Result: [('2026-01-01','2026-01-08'), ('2026-01-08','2026-01-15'), ...]
# Submit each chunk as a separate ESS job or runReport call
```

**Verify**: Each chunk returns within timeout; union of all chunks matches expected total row count.

## Code Examples

### Python: Extract BIP report via SOAP with retry logic

```python
# Input:  BIP report path, parameters, Fusion Cloud host
# Output: Decoded CSV file content

import requests
import base64
import time
from lxml import etree

def extract_bip_report(host, username, password, report_path,
                       params, output_format='csv', max_retries=3):
    """Extract data from Oracle BIP report via SOAP."""
    url = f"https://{host}/xmlpserver/services/ExternalReportWSSService"

    param_xml = ""
    for name, value in params.items():
        param_xml += f"""
            <pub:item>
              <pub:name>{name}</pub:name>
              <pub:values><pub:item>{value}</pub:item></pub:values>
            </pub:item>"""

    envelope = f"""<?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                      xmlns:pub="http://xmlns.oracle.com/oxp/service/PublicReportService">
      <soapenv:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
          <wsse:UsernameToken>
            <wsse:Username>{username}</wsse:Username>
            <wsse:Password>{password}</wsse:Password>
          </wsse:UsernameToken>
        </wsse:Security>
      </soapenv:Header>
      <soapenv:Body>
        <pub:runReport>
          <pub:reportRequest>
            <pub:attributeFormat>{output_format}</pub:attributeFormat>
            <pub:reportAbsolutePath>{report_path}</pub:reportAbsolutePath>
            <pub:parameterNameValues>
              <pub:listOfParamNameValues>{param_xml}
              </pub:listOfParamNameValues>
            </pub:parameterNameValues>
          </pub:reportRequest>
        </pub:runReport>
      </soapenv:Body>
    </soapenv:Envelope>"""

    headers = {'Content-Type': 'text/xml; charset=utf-8',
               'SOAPAction': ''}

    for attempt in range(max_retries):
        try:
            resp = requests.post(url, data=envelope,
                                headers=headers, timeout=230)
            resp.raise_for_status()
            tree = etree.fromstring(resp.content)
            ns = {'pub': 'http://xmlns.oracle.com/oxp/service/PublicReportService'}
            b64_data = tree.find('.//pub:reportBytes', ns).text
            return base64.b64decode(b64_data)
        except requests.exceptions.Timeout:
            if attempt < max_retries - 1:
                time.sleep(2 ** attempt * 5)
                continue
            raise RuntimeError(
                "BIP report timed out after 230s — "
                "switch to ESS async pattern for this report"
            )
        except Exception as e:
            if attempt < max_retries - 1:
                time.sleep(2 ** attempt * 5)
                continue
            raise

# Usage
data = extract_bip_report(
    host='fa-xxxx.fa.ocs.oraclecloud.com',
    username='INTEGRATION_USER',
    password='password',
    report_path='/Custom/Financials/AP_Invoice_Listing.xdo',
    params={'p_from_date': '2026-01-01', 'p_to_date': '2026-03-09'},
    output_format='csv'
)
```

### cURL: Quick test of BIP SOAP report extraction

```bash
# Input:  Fusion Cloud host, credentials, report path
# Output: SOAP response with base64-encoded report in reportBytes element

curl -X POST \
  "https://fa-xxxx.fa.ocs.oraclecloud.com/xmlpserver/services/ExternalReportWSSService" \
  -H "Content-Type: text/xml; charset=utf-8" \
  -H "SOAPAction: " \
  --connect-timeout 30 \
  --max-time 240 \
  -d '<?xml version="1.0" encoding="UTF-8"?>
  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                    xmlns:pub="http://xmlns.oracle.com/oxp/service/PublicReportService">
    <soapenv:Header>
      <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <wsse:UsernameToken>
          <wsse:Username>INTEGRATION_USER</wsse:Username>
          <wsse:Password>PASSWORD</wsse:Password>
        </wsse:UsernameToken>
      </wsse:Security>
    </soapenv:Header>
    <soapenv:Body>
      <pub:runReport>
        <pub:reportRequest>
          <pub:attributeFormat>csv</pub:attributeFormat>
          <pub:reportAbsolutePath>/Custom/Financials/AP_Invoice_Listing.xdo</pub:reportAbsolutePath>
          <pub:parameterNameValues>
            <pub:listOfParamNameValues>
              <pub:item>
                <pub:name>p_from_date</pub:name>
                <pub:values><pub:item>2026-01-01</pub:item></pub:values>
              </pub:item>
            </pub:listOfParamNameValues>
          </pub:parameterNameValues>
        </pub:reportRequest>
      </pub:runReport>
    </soapenv:Body>
  </soapenv:Envelope>'

# Expected: HTTP 200 with <reportBytes> containing base64 CSV data
# Decode: echo "BASE64_DATA" | base64 -d > output.csv
```

### cURL: Quick test via REST API

```bash
# Input:  Fusion Cloud host, credentials, report path (URL-encoded)
# Output: Multipart response with JSON metadata + binary report

curl -X POST \
  "https://fa-xxxx.fa.ocs.oraclecloud.com/xmlpserver/services/rest/v1/reports/Custom%2FFinancials%2FAP_Invoice_Listing.xdo/run" \
  -H "Authorization: Basic $(echo -n 'INTEGRATION_USER:PASSWORD' | base64)" \
  -H "Content-Type: application/json" \
  --max-time 240 \
  -d '{
    "attributeFormat": "csv",
    "parameterNameValues": {
      "listOfParamNameValues": [
        {"name": "p_from_date", "values": ["2026-01-01"]},
        {"name": "p_to_date", "values": ["2026-03-09"]}
      ]
    }
  }'

# Expected: multipart/form-data with ReportResponse (JSON) + ReportOutput (octet-stream)
```

## Data Mapping

### Output Format Selection Guide

| Format | MIME Type | Best For | Parsing Complexity | Type Preservation |
|---|---|---|---|---|
| csv | text/plain | ETL pipelines, data warehouse loads | Low | None (all strings) |
| xml (data) | application/xml | Structured parsing, type-safe extraction | Medium | Full (typed elements) |
| excel | application/vnd.ms-excel | Human review + extraction hybrid | High | Partial |
| pdf | application/pdf | Compliance/audit output only | N/A | N/A (not parseable) |
| html | text/html | Web display, email delivery | High | None |

### Data Type Gotchas

- BIP CSV output treats all fields as strings — dates come in the report's display format, not ISO 8601. Parse with explicit date format matching the BIP template's date mask [src4]
- XML (data) output preserves Oracle date types as xsd:dateTime (e.g., 2026-03-09T00:00:00.000+00:00) — this is the most reliable format for downstream type mapping [src4]
- Numeric fields in CSV lose precision for large numbers (>15 digits) due to Excel-style handling in some BIP data models — use XML or set NUMBER columns as VARCHAR in the data model to prevent truncation [src6]
- Multi-value parameters serialize as comma-delimited strings in the SOAP request but the BIP data model may expect pipe-delimited or individual bind variables — always test parameter passing with the specific report [src4]
- BIP report column names in CSV output use the template display labels, not the data model column names — if the template changes, your parser breaks [src1]

## Error Handling & Failure Points

### Common Error Codes

| Error | Meaning | Cause | Resolution |
|---|---|---|---|
| SOAP Fault: Timeout | Report execution exceeded 240s | Dataset too large for synchronous execution | Switch to ESS async pattern; reduce date range; add filters |
| HTTP 401 | Authentication failure | Invalid credentials or missing WS-Security header | Verify credentials; confirm user has BI Consumer role; use ExternalReportWSSService |
| HTTP 500 + "oracle.xdo" stack trace | BIP internal error | Memory guard triggered, data model SQL error, or template mismatch | Reduce data volume; check BIP data model SQL; verify template compatibility |
| "Report not found" | Invalid report path | Wrong absolute path or missing permissions on catalog folder | Verify path in Fusion BI Catalog; check folder-level security |
| "Invalid parameter" | Parameter name mismatch | Parameter name in SOAP request doesn't match BIP data model | Use getReportParameters to discover exact parameter names and types |
| ESS "Error" status | ESS job failed | Various — check ESS job log for details | Review ESS diagnostic log; common causes are data model SQL errors and template rendering failures |

[src2, src4, src5]

### Failure Points in Production

- **Silent truncation on memory guard**: When BIP hits memory limits, it may return a partial dataset without error — the CSV looks valid but is incomplete. Fix: `Compare row counts against a known baseline query; implement record count validation checksums`. [src2]
- **Thread pool exhaustion**: Running 5+ concurrent BIP extractions can exhaust the BI domain thread pool, causing all Fusion reporting to hang. Fix: `Serialize BIP extraction jobs; schedule during off-peak hours (e.g., weekend or after business hours in the primary user timezone)`. [src2]
- **Base64 out-of-memory on client**: Large reports (>50MB output) cause client-side OOM when decoding the base64 SOAP response in memory. Fix: `Use sizeOfDataChunkDownload parameter to chunk the response; or switch to ESS + UCM download pattern`. [src4]
- **Date format mismatch in parameters**: BIP data model may expect dates in a locale-specific format (e.g., DD-MON-YYYY for Oracle) while your integration sends ISO 8601. Fix: `Use getReportParameters to discover the dateFormatString for each date parameter; pass dates in the expected format`. [src4]
- **Template version drift**: When Oracle applies quarterly patches, seeded report templates can change column names or add new fields, breaking CSV parsers that depend on column positions. Fix: `Parse CSV by header name, never by position; implement a template version check before extraction`. [src1]

## Anti-Patterns

### Wrong: Synchronous BIP extraction for large datasets

```python
# BAD — synchronous SOAP call for large dataset extraction
# This will timeout at 240s and consume BI thread pool capacity
def extract_all_invoices():
    return call_bip_soap(
        report='/Custom/Financials/ALL_AP_Invoices.xdo',
        params={'p_from_date': '2020-01-01'},  # 6 years of data!
        format='csv'
    )  # Will timeout; may return partial data silently
```

### Correct: ESS async job with date chunking

```python
# GOOD — register as ESS BIPJobType, chunk by date range
def extract_invoices_incremental():
    chunks = generate_date_chunks(
        start=datetime(2026, 1, 1),
        end=datetime(2026, 3, 9),
        chunk_days=7
    )
    for from_date, to_date in chunks:
        job_id = submit_ess_job(
            job_definition='AP_INVOICE_EXTRACT_ESS',
            params={'p_from_date': from_date, 'p_to_date': to_date}
        )
        wait_for_completion(job_id)
        download_output(job_id)
```

### Wrong: Using BIP when BICC view objects exist

```python
# BAD — extracting GL balances via BIP when BICC covers them
# BICC has incremental/delta support, no timeout risk, dedicated threads
data = call_bip_soap(
    report='/Custom/GL/GL_Balances_Extract.xdo',
    params={'p_ledger': 'US Primary'},
    format='csv'
)
```

### Correct: Use BICC for any data it covers

```python
# GOOD — use BICC when the required view objects are available
# BICC handles bulk extraction natively with incremental support
bicc_extract = submit_bicc_offering(
    offering='FinancialsTransactionalBusinessIntelligence',
    view_objects=['FscmTopModelAM.GlBalancesAM.GlBalancesVO'],
    mode='incremental',
    target='object_storage_bucket'
)
```

### Wrong: Parsing BIP CSV by column position

```python
# BAD — column positions change when Oracle patches update templates
invoice_number = row[0]
vendor_name = row[3]
amount = row[7]
```

### Correct: Parse by header name

```python
# GOOD — header-based parsing survives template column changes
import csv
reader = csv.DictReader(open('invoices.csv'))
for row in reader:
    invoice_number = row['Invoice Number']
    vendor_name = row['Vendor Name']
    amount = float(row['Invoice Amount'])
```

## Common Pitfalls

- **Using runReport for data extraction without checking BICC first**: Many teams default to BIP because they already have reports. Fix: `Always verify if the data is available via BICC view objects first — use the BICC offering catalog in Fusion Setup`. [src1]
- **Not setting client-side timeout lower than 240s**: If your HTTP client timeout is >240s, the server-side timeout triggers first and returns a fault; if your client timeout is <240s, you get a client-side timeout with no server response. Fix: `Set client timeout to 230s to ensure you receive the server-side error message`. [src2]
- **Ignoring base64 memory overhead**: A 100MB report becomes ~133MB in the SOAP response due to base64 encoding. Fix: `Budget 2x the expected output size in client memory; use streaming/chunked decoding for reports >20MB`. [src4]
- **Running BIP extractions during business hours**: BIP shares the BI domain thread pool with interactive Fusion users. Fix: `Schedule all BIP extraction jobs outside peak business hours; use ESS job windows to enforce this`. [src2]
- **Not validating output completeness**: BIP can return partial data when memory guards trigger, with no error indication. Fix: `Include a COUNT(*) summary row or record count parameter in the report; validate every extraction against this count`. [src2]
- **Hardcoding report paths for seeded Oracle reports**: Oracle can change seeded report paths between releases. Fix: `Use the BI Catalog SOAP service to discover current paths; store paths in configuration, not code`. [src1]

## Diagnostic Commands

```bash
# Test BIP SOAP connectivity (expect HTTP 200 with WSDL)
curl -s -o /dev/null -w "%{http_code}" \
  "https://fa-xxxx.fa.ocs.oraclecloud.com/xmlpserver/services/ExternalReportWSSService?wsdl"

# Test REST API connectivity (expect HTTP 401 without auth, confirms endpoint exists)
curl -s -o /dev/null -w "%{http_code}" \
  "https://fa-xxxx.fa.ocs.oraclecloud.com/xmlpserver/services/rest/v1/reports"

# Discover report parameters via SOAP getReportParameters
# Returns parameter names, types, default values, and LOV options
curl -X POST \
  "https://fa-xxxx.fa.ocs.oraclecloud.com/xmlpserver/services/ExternalReportWSSService" \
  -H "Content-Type: text/xml" \
  -d '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
       xmlns:pub="http://xmlns.oracle.com/oxp/service/PublicReportService">
    <soapenv:Header><!-- WS-Security header --></soapenv:Header>
    <soapenv:Body>
      <pub:getReportParameters>
        <pub:reportAbsolutePath>/Custom/Financials/AP_Invoice_Listing.xdo</pub:reportAbsolutePath>
      </pub:getReportParameters>
    </soapenv:Body>
  </soapenv:Envelope>'

# Check ESS job status via REST (Fusion Cloud 25A+)
curl -u "INTEGRATION_USER:PASSWORD" \
  "https://fa-xxxx.fa.ocs.oraclecloud.com/hcmRestApi/resources/11.13.18.05/ess-job-details?q=RequestId=12345"

# Monitor BI server health (admin role required)
curl -u "ADMIN_USER:PASSWORD" \
  "https://fa-xxxx.fa.ocs.oraclecloud.com/xmlpserver/services/rest/v1/server/health"
```

## Version History & Compatibility

| Release | Date | Status | Breaking Changes | Migration Notes |
|---|---|---|---|---|
| 25B | 2026-02 | Current | None | — |
| 25A | 2025-11 | Supported | None | ESS REST API enhanced |
| 24D | 2025-08 | Supported | None | — |
| 24C | 2025-05 | Supported | Rebranded to Oracle Analytics Publisher; SOAP endpoints unchanged | UI references changed; API backward-compatible |
| 24B | 2025-02 | Supported | None | — |
| 24A | 2024-11 | EOL | REST v1 enhanced with additional report operations | — |

[src1, src7]

### Deprecation Policy

Oracle Fusion Cloud follows a quarterly release cycle (A/B/C/D per year). SOAP web service endpoints for BI Publisher have remained stable across major releases. Oracle has not announced deprecation of the BIP SOAP API but has consistently positioned BICC and REST as the strategic extraction tools. The 24C rebranding to "Oracle Analytics Publisher" changed only the UI — all SOAP/REST API endpoints remain unchanged. [src1]

## When to Use / When Not to Use

| Use When | Don't Use When | Use Instead |
|---|---|---|
| Data is only available via BIP reports (no BICC VO coverage) | Data is available via BICC view objects | BICC bulk extraction |
| Need pre-formatted output (PDF, Excel) for compliance/audit | Need raw transactional data for warehouse loading | BICC or REST API |
| Dataset is <50K rows per extraction run | Dataset exceeds 100K rows | BICC (no row limits) |
| Existing BIP reports already model the required data accurately | Need real-time individual record operations | REST API |
| One-time or low-frequency extractions (daily or less) | Need near-real-time data feeds (<5 min latency) | Business Events or REST API |
| Need complex report logic (calculated fields, cross-module joins) | Simple single-table extraction | REST API or BICC |
| Integration team has BIP/OTBI expertise | Team has no Oracle reporting expertise | REST API (simpler learning curve) |

## Cross-System Comparison

| Capability | BI Publisher (BIP) | BICC | REST API | FBDI |
|---|---|---|---|---|
| **Direction** | Outbound only | Outbound only | Inbound + outbound | Inbound only |
| **Volume sweet spot** | 1K-50K rows | 50K-10M+ rows | 1-1K records | 1K-500K rows |
| **Timeout risk** | High (240s sync) | None (async) | Low | None (async) |
| **CDC/Incremental** | Manual (date params) | Built-in | Manual (filters) | N/A |
| **Output formats** | CSV, XML, Excel, PDF, HTML | CSV | JSON | CSV (template-based) |
| **Scheduling** | ESS jobs / ScheduleService | Built-in | External | ESS jobs |
| **Auth methods** | WS-Security, Basic | OAuth 2.0 | OAuth 2.0, Basic | N/A (Fusion internal) |
| **Thread pool impact** | Shared with reporting | Dedicated | Dedicated | ESS thread pool |
| **Data coverage** | Broadest (any data model) | Limited to published VOs | REST-enabled objects | Import templates only |
| **Oracle support status** | Unsupported for extraction | Fully supported | Fully supported | Fully supported |
| **Third-party connectors** | Fivetran, Celonis, OCI DI | OCI DI, most iPaaS | Most iPaaS | Limited |

## Important Caveats

- Oracle's A-Team explicitly states that using BI Publisher for data extraction is an **unsupported pattern** — if extraction via BIP causes performance issues, Oracle Support may decline to assist [src1, src2]
- Memory guards and timeout thresholds are pod-level configurations managed by Oracle — customers cannot adjust them in Fusion Cloud SaaS [src2]
- The 24C rebranding from "BI Publisher" to "Oracle Analytics Publisher" changed UI labels but not API endpoints — existing integrations continue to work without modification [src1]
- Third-party connectors (Fivetran, Celonis) that use BIP as a data source are subject to the same memory and timeout limitations as direct API calls [src3]
- BIP report performance varies significantly based on the underlying data model SQL complexity and Fusion pod load — always performance-test with production-representative data volumes before committing to a BIP extraction pattern [src2]

## Related Units

- [Oracle BICC Bulk Extraction](/business/erp-integration/oracle-bicc-extraction/2026) — Oracle's recommended bulk extraction tool (alternative_to)
- [Oracle ERP Cloud REST API](/business/erp-integration/oracle-erp-cloud-rest-api/2026) — Real-time transactional API (related_to)
