← Back to blog

Oracle Fusion REST API Descriptive Flexfields (DFF): Reading and Writing Segments

By Mostafa Mansour 7 min read Oracle FusionREST APIFlexfieldsDFFEFFHCMFSCM

Almost every object in Oracle Fusion — workers, invoices, positions, document records, credit memos — ships with a flexfield: a set of extra attributes your implementation configured that don’t exist in the base schema. Over REST, flexfields show up as their own child resource with their own quirks (a special __FLEX_Context field, segments that change depending on that context, and 400 errors that make no sense until you understand why). Every search result for this today is Oracle’s own reference documentation — module by module, endpoint by endpoint, with no practical walkthrough of the pattern itself. This is that walkthrough.

All examples use an anonymized pod (acme.fa.us2.oraclecloud.com) and placeholder identifiers — swap in your own.

Three kinds of flexfield, one REST pattern

Fusion has three flexfield types that all follow the same child-resource shape over REST, with different behavior:

All three are exposed as a child resource on their parent, named after the pattern <parent>DFF / <parent>EFF / <parent>DDF. Real examples from the catalog: workersworkersDFF + workersEFF, invoices (FSCM) → invoiceDff, receivablesCreditMemosreceivablesCreditMemoDFF + receivablesCreditMemoTransactionDFF, documentRecordsdocumentRecordsDFF + documentRecordsDDF, positionsPositionCustomerFlex, jobsJobCustomerFlex.

Why you can’t copy segment names from a blog post

This is the part every generic guide skips, and the reason Oracle’s own docs read the way they do: segment names are configured per tenant. Two Fusion pods running the same module can have completely different DFF segments, because an administrator built them in the Flexfields task in Setup and Maintenance. There is no universal CustomAttribute1 you can rely on — what exists on your pod is whatever your implementation team defined. That’s exactly why the practical challenge is discovery, not memorization.

Discovering what’s configured: GET the DFF child

Before writing anything, GET the flexfield child resource under a real parent record to see the shape you’re working with:

curl -u integration.user \
  "https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers/00020000000EACED.../child/workersDFF"

A populated response looks like:

{
  "items": [
    {
      "PersonId": 300000001234567,
      "__FLEX_Context": "Global Data Elements",
      "__FLEX_Context_DisplayValue": "Global Data Elements",
      "links": [ ... ]
    }
  ],
  "count": 1,
  "hasMore": false
}

__FLEX_Context is the field that determines which segment set is active. If your pod has segments configured for this context, they appear as additional attributes alongside it — named whatever your implementation called them. If the row is empty aside from the context, no values have been entered yet, not that no segments exist.

The describe endpoint: structure without a populated row

If no record has flexfield data yet, or you need the full attribute list (including type and required-ness) before you build a payload, use /describe on the resource:

curl -u integration.user \
  "https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers/describe"

The response includes the DFF/EFF child definitions with their available contexts and, per context, the segment attributes and data types — this is the authoritative source for “what fields exist,” not a sample payload from any guide (including this one).

Creating a record with flexfield segments

Once you know the active context and its segment names for your tenant, nest the DFF child array in the parent POST — same pattern used on documentRecords:

curl -u integration.user -X POST \
  -H 'Content-Type: application/json' \
  -d '{
    "PersonNumber": "100001",
    "workersDFF": [
      {
        "__FLEX_Context": "Global Data Elements",
        "CustomField1": "Value1"
      }
    ]
  }' \
  "https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers"

CustomField1 here stands in for whatever your tenant’s admin named the segment — confirm it against your own /describe response, not this example. Updating an existing row is a PATCH to the DFF child’s own URL (.../child/workersDFF/{contextId}), same as any other child resource.

Why a valid-looking payload still 400s

This is the recurring integration bug with flexfields specifically:

Where this fits with everything else

Flexfields are additive to the base resource — they don’t change how q filters or finders work against the parent’s standard fields, and ETag/If-Match concurrency applies to flexfield child updates the same as any other PATCH. You’ll hit this pattern on HCM objects (workers, document records) and FSCM objects (invoices, receivables credit memos) alike — for full request walkthroughs on each, see the HCM REST API examples post and the FSCM REST API guide. The endpoint catalog lists which child resources — DFF, EFF, or otherwise — exist on each of the top HCM and FSCM endpoints, including workers, invoices, and receivables credit memos.


This post is part of our complete Oracle Fusion API guide — auth, base URLs, q filters, finders, and key endpoints in one place.