<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mostafa Mansour</title>
    <description>The latest articles on DEV Community by Mostafa Mansour (@mostafamansour1).</description>
    <link>https://dev.to/mostafamansour1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4020937%2Ff17d7625-3b10-4122-9971-9f4ede69c8d9.png</url>
      <title>DEV Community: Mostafa Mansour</title>
      <link>https://dev.to/mostafamansour1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mostafamansour1"/>
    <language>en</language>
    <item>
      <title>"Oracle Fusion REST API 400 Bad Request: The 6 Real Causes"</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Thu, 13 Aug 2026 06:26:23 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/oracle-fusion-rest-api-400-bad-request-the-6-real-causes-3de8</link>
      <guid>https://dev.to/mostafamansour1/oracle-fusion-rest-api-400-bad-request-the-6-real-causes-3de8</guid>
      <description>&lt;p&gt;A &lt;code&gt;400 Bad Request&lt;/code&gt; from an Oracle Fusion REST API is one of the least informative failures you'll hit — the error body is often just &lt;code&gt;"Invalid operation create for the specified resource."&lt;/code&gt;, with no field name and no hint what part of the request was wrong. Here are the six real causes, in the order worth checking, with the actual fix for each. Examples use an anonymized pod (&lt;code&gt;acme.fa.us2.oraclecloud.com&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  First, rule out the other 4xx codes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;Not authenticated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;403&lt;/td&gt;
&lt;td&gt;Authenticated, missing role/privilege&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404&lt;/td&gt;
&lt;td&gt;Resource/record doesn't exist at that path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;412&lt;/td&gt;
&lt;td&gt;ETag mismatch on PATCH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;429&lt;/td&gt;
&lt;td&gt;Rate limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;400&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The request itself is malformed or invalid&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  1. Malformed or unsupported &lt;code&gt;q&lt;/code&gt; syntax
&lt;/h2&gt;

&lt;p&gt;The most common cause, two failure modes. Wrong syntax for the framework version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Fails with 400 on REST-Framework-Version 2+
q=DepartmentId=300;LocationCode=NY

# Works
q=DepartmentId=300 and LocationCode=NY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And filtering on an operator a field doesn't support — this returns 400, not an empty result set, which throws people off because the field name in the error is correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Missing required fields on POST
&lt;/h2&gt;

&lt;p&gt;Fusion resources need far fewer fields than their full schema suggests, but the required ones are non-negotiable. &lt;code&gt;workers&lt;/code&gt; needs &lt;code&gt;names&lt;/code&gt; plus a correctly-shaped &lt;code&gt;workRelationships&lt;/code&gt; array, not flat top-level name fields. Check what's actually mandatory with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET .../workers/describe?metadataMode=minimal
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Required in the UI" and "required by the REST payload" are frequently different sets.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. "Invalid operation &lt;code&gt;&amp;lt;X&amp;gt;&lt;/code&gt; for the specified resource"
&lt;/h2&gt;

&lt;p&gt;This exact text appears across multiple Oracle support KB articles. It means the HTTP method you sent isn't a supported operation on that resource or resource state — POSTing to a GET-only resource, PATCHing an already-submitted transaction, or calling an action (&lt;code&gt;;action=terminate&lt;/code&gt;) with the wrong verb (actions are POST, not PATCH).&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Malformed JSON or wrong Content-Type
&lt;/h2&gt;

&lt;p&gt;A trailing comma, an unescaped quote, or sending &lt;code&gt;Content-Type: application/json&lt;/code&gt; when an operation specifically expects &lt;code&gt;application/vnd.oracle.adf.resourceitem+json&lt;/code&gt; (some batch/action operations do) all surface as 400.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. DFF/EFF context or segment mismatches
&lt;/h2&gt;

&lt;p&gt;If a payload includes a flexfield segment, it has to match a context actually configured for that record. The same payload can work for one business unit and fail for another because flexfield contexts are usually configured per that dimension.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the &lt;code&gt;detail&lt;/code&gt; field
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bad Request"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The value US_LEGAL_EMPLOYER for attribute LegislationCode is invalid."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"o:errorCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FND_CMN_VALIDATION_ERROR"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;detail&lt;/code&gt; is usually more specific than the status line — log it in full, not just the code.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-400-bad-request/" rel="noopener noreferrer"&gt;OPAL blog&lt;/a&gt; — the full version covers the diagnostic checklist and cross-links to the q-parameter, describe-endpoint, and DFF guides. OPAL is a free offline desktop explorer for 59,000+ Oracle Fusion REST endpoints: &lt;a href="https://opalapi.dev/" rel="noopener noreferrer"&gt;opalapi.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>rest</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>"The 6 Pagination Bugs That Eat Oracle Fusion REST API Integrations"</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Sun, 19 Jul 2026 07:04:18 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/the-6-pagination-bugs-that-eat-oracle-fusion-rest-api-integrations-38i8</link>
      <guid>https://dev.to/mostafamansour1/the-6-pagination-bugs-that-eat-oracle-fusion-rest-api-integrations-38i8</guid>
      <description>&lt;p&gt;Every collection GET against an Oracle Fusion REST API is paginated whether you ask for it or not. Call &lt;code&gt;GET /workers&lt;/code&gt;, treat the response as "all workers," and you silently got the first &lt;strong&gt;25 rows&lt;/strong&gt; — nothing warns you that thousands more exist. Here are the six pagination bugs I keep seeing in Fusion integrations, and the loop that avoids all of them. Replace &lt;code&gt;acme.fa.us2.oraclecloud.com&lt;/code&gt; with your pod; all sample data is anonymized.&lt;/p&gt;

&lt;h2&gt;
  
  
  The response wrapper
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hasMore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"offset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;count&lt;/code&gt; is this page's size, not the total. &lt;code&gt;hasMore&lt;/code&gt; is your loop condition. &lt;code&gt;limit&lt;/code&gt; is what the server &lt;strong&gt;actually used&lt;/strong&gt; — it can override what you asked for. &lt;code&gt;offset&lt;/code&gt; is 0-based.&lt;/p&gt;

&lt;h2&gt;
  
  
  The six bugs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. First 25 rows only.&lt;/strong&gt; No &lt;code&gt;limit&lt;/code&gt; sent, default applied, &lt;code&gt;hasMore&lt;/code&gt; ignored. The classic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Off-by-one offset.&lt;/strong&gt; &lt;code&gt;offset&lt;/code&gt; is 0-based; a 1-based assumption (a real bug in identity-management connectors) duplicates or drops one record at every page boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Silent limit override.&lt;/strong&gt; The cap is 500 on most resources. Ask for &lt;code&gt;limit=1000&lt;/code&gt;, get 500, increment offset by 1000 → every second page skipped. Always increment by the &lt;strong&gt;response's&lt;/strong&gt; &lt;code&gt;limit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Unstable ordering.&lt;/strong&gt; No &lt;code&gt;orderBy&lt;/code&gt; means rows can shift between calls — nightly syncs "lose" records nondeterministically. Always sort on a stable unique key (&lt;code&gt;PersonId&lt;/code&gt;, &lt;code&gt;InvoiceId&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. totalResults on every page.&lt;/strong&gt; It forces an extra count query per request. Fetch it once with &lt;code&gt;limit=1&lt;/code&gt;, then run the loop without it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Restarting after a 429.&lt;/strong&gt; A 500-per-page loop over a big resource is thousands of calls. Back off and resume from the saved &lt;code&gt;offset&lt;/code&gt;; don't start over.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop that avoids all six
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'https://acme.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/invoices'&lt;/span&gt;
&lt;span class="nv"&gt;LIMIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;500
&lt;span class="nv"&gt;OFFSET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
&lt;span class="k"&gt;while&lt;/span&gt; :&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;PAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s1"&gt;'integration.user@example.com:YourPassword'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;?limit=&lt;/span&gt;&lt;span class="nv"&gt;$LIMIT&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;offset=&lt;/span&gt;&lt;span class="nv"&gt;$OFFSET&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;onlyData=true&amp;amp;orderBy=InvoiceId"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PAGE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.items[].InvoiceNumber'&lt;/span&gt;
  &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PAGE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="s1"&gt;'.hasMore'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;break
  &lt;/span&gt;&lt;span class="nv"&gt;OFFSET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;OFFSET &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PAGE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="s1"&gt;'.limit'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;onlyData=true&lt;/code&gt; strips per-item HATEOAS links and shrinks payloads dramatically — always use it when iterating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filter before you paginate
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;limit&lt;/code&gt;/&lt;code&gt;offset&lt;/code&gt; compose with &lt;code&gt;q&lt;/code&gt; and finders. A &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-q-parameter/" rel="noopener noreferrer"&gt;q filter&lt;/a&gt; that cuts 48,000 rows to 3,000 saves you 90 pages before pagination starts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s1"&gt;'integration.user@example.com:YourPassword'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?q=assignments.AssignmentStatusType=%27ACTIVE%27&amp;amp;limit=500&amp;amp;offset=0&amp;amp;onlyData=true&amp;amp;orderBy=PersonId'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which fields are filterable is endpoint-specific — &lt;a href="https://opalapi.dev/apis/hcm/workers/" rel="noopener noreferrer"&gt;&lt;code&gt;/workers&lt;/code&gt;&lt;/a&gt; alone has 307 queryable fields, and the free field-level reference at &lt;a href="https://opalapi.dev/apis/" rel="noopener noreferrer"&gt;opalapi.dev/apis&lt;/a&gt; lists q fields, finders, and child resources for the top HCM and FSCM endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expanded children paginate too
&lt;/h2&gt;

&lt;p&gt;From REST framework v3, an expanded child returns a collection wrapper with its own &lt;code&gt;hasMore&lt;/code&gt; — and any child with &lt;strong&gt;more than 500 items isn't expanded at all&lt;/strong&gt; (you get a &lt;code&gt;links&lt;/code&gt; entry instead). For large children (assignments across history), skip &lt;code&gt;expand&lt;/code&gt; and paginate the child URI directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s1"&gt;'integration.user@example.com:YourPassword'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers/00020000000EACED.../child/assignments?limit=100&amp;amp;offset=0&amp;amp;onlyData=true'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-pagination/" rel="noopener noreferrer"&gt;OPAL blog&lt;/a&gt; — the full version covers totalResults costs, hasMore-vs-row-security gotchas, and framework-version differences. OPAL is a free offline desktop explorer for 59,000+ Oracle Fusion endpoints: &lt;a href="https://opalapi.dev/" rel="noopener noreferrer"&gt;opalapi.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>rest</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>"Oracle FSCM REST API: What Transfers From HCM and What Doesn't"</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Fri, 17 Jul 2026 19:49:53 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/oracle-fscm-rest-api-what-transfers-from-hcm-and-what-doesnt-4c4p</link>
      <guid>https://dev.to/mostafamansour1/oracle-fscm-rest-api-what-transfers-from-hcm-and-what-doesnt-4c4p</guid>
      <description>&lt;p&gt;If you've integrated with Oracle Fusion HCM (&lt;code&gt;/hcmRestApi/&lt;/code&gt;), the Financials and Supply Chain surface (&lt;code&gt;/fscmRestApi/&lt;/code&gt;) is 90% the same API with a different catalog. Here's the 10% that matters, with working examples. Replace &lt;code&gt;acme.fa.us2.oraclecloud.com&lt;/code&gt; with your pod; all sample data is anonymized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same host, different path segment
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HCM:  https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers
FSCM: https://acme.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/invoices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;q&lt;/code&gt;, finders, &lt;code&gt;expand&lt;/code&gt;, &lt;code&gt;fields&lt;/code&gt;, and &lt;code&gt;limit&lt;/code&gt;/&lt;code&gt;offset&lt;/code&gt;/&lt;code&gt;hasMore&lt;/code&gt; pagination all behave identically. Auth is the same too — Basic over TLS for dev, OAuth 2.0 for production. A 403 on an FSCM resource almost always means a missing Financials/SCM duty role, not a wrong URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know how filterable a resource is before you call it
&lt;/h2&gt;

&lt;p&gt;These numbers come from the real Oracle OpenAPI spec:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;q fields&lt;/th&gt;
&lt;th&gt;Finders&lt;/th&gt;
&lt;th&gt;Children&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://opalapi.dev/apis/fscm/invoices/" rel="noopener noreferrer"&gt;&lt;code&gt;/invoices&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://opalapi.dev/apis/fscm/expenses/" rel="noopener noreferrer"&gt;&lt;code&gt;/expenses&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://opalapi.dev/apis/fscm/payables-payments/" rel="noopener noreferrer"&gt;&lt;code&gt;/payablesPayments&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/payablesInterfaceInvoices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;186&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last row is the gotcha pattern: some resources are all q fields and no finders, others the reverse. Checking first saves you from writing a filter the endpoint can't serve.&lt;/p&gt;

&lt;h2&gt;
  
  
  q filters that actually work on /invoices
&lt;/h2&gt;

&lt;p&gt;Real queryable fields include &lt;code&gt;BusinessUnit&lt;/code&gt;, &lt;code&gt;ApprovalStatus&lt;/code&gt;, &lt;code&gt;AmountPaid&lt;/code&gt;, &lt;code&gt;AccountingDate&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /fscmRestApi/resources/11.13.18.05/invoices
    ?q=AmountPaid=0 and BaseAmount&amp;gt;10000 and AccountingDate&amp;gt;'2026-01-01'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lowercase &lt;code&gt;and&lt;/code&gt;/&lt;code&gt;or&lt;/code&gt;, single quotes on strings only, URL-encode exactly once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer finders when they exist
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /fscmRestApi/resources/11.13.18.05/payablesPayments
    ?finder=PrimaryKey;CheckId=300000001234567
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/expenses&lt;/code&gt; ships &lt;code&gt;FindCCTransactions&lt;/code&gt; and friends; &lt;code&gt;/receivablesInvoices&lt;/code&gt; has &lt;code&gt;invoiceSearch&lt;/code&gt;. Finders map to indexed view criteria on Oracle's side — consistently faster than the equivalent &lt;code&gt;q&lt;/code&gt; on large tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  The FSCM-specific 404
&lt;/h2&gt;

&lt;p&gt;Resource names are camelCase and case-sensitive: &lt;code&gt;payablesPayments&lt;/code&gt; works, &lt;code&gt;payablespayments&lt;/code&gt; is a 404 that looks like a valid path. This one costs people hours.&lt;/p&gt;




&lt;p&gt;Full guide with expand examples, pagination, and the complete error table: &lt;a href="https://opalapi.dev/blog/oracle-fscm-rest-api/" rel="noopener noreferrer"&gt;Oracle FSCM REST API: Base URL, Key Endpoints, and Working Examples&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I build &lt;a href="https://opalapi.dev/" rel="noopener noreferrer"&gt;OPAL&lt;/a&gt;, an offline Oracle Fusion API explorer — 59,000+ HCM/FSCM endpoints searchable without internet, with visual q filter and finder builders and a full &lt;a href="https://opalapi.dev/apis/" rel="noopener noreferrer"&gt;endpoint reference&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>rest</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>"6 Oracle HCM REST API Requests I Copy-Paste Every Week"</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Tue, 14 Jul 2026 08:11:44 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/6-oracle-hcm-rest-api-requests-i-copy-paste-every-week-2j42</link>
      <guid>https://dev.to/mostafamansour1/6-oracle-hcm-rest-api-requests-i-copy-paste-every-week-2j42</guid>
      <description>&lt;p&gt;Oracle's HCM REST API docs describe every endpoint, but they rarely show a complete working request next to the response you'll actually get. Here are the six calls I reach for constantly — adapt the pod hostname (&lt;code&gt;acme.fa.us2.oraclecloud.com&lt;/code&gt;) and credentials, everything else works as-is. All sample data is anonymized; Basic Auth for readability (use OAuth 2.0 in production).&lt;/p&gt;

&lt;p&gt;Base URL for everything below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1. Get workers, paginated properly
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"integration.user@example.com:password"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?limit=10"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always pass &lt;code&gt;limit&lt;/code&gt; (default page size is 25, max 500). The response's &lt;code&gt;hasMore: true&lt;/code&gt; tells you to keep going — increment &lt;code&gt;offset&lt;/code&gt; until it flips to &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. One worker by person number with &lt;code&gt;q&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"user:pass"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='100001'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;String values in &lt;code&gt;q&lt;/code&gt; must be single-quoted; numbers don't. If you get "The query parameter is invalid", the field probably isn't queryable on that endpoint — workers alone has &lt;a href="https://opalapi.dev/apis/hcm/workers/" rel="noopener noreferrer"&gt;307 queryable fields&lt;/a&gt;, and it's never all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Range filter, URL-encoded once
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"user:pass"&lt;/span&gt; &lt;span class="nt"&gt;--get&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s2"&gt;"q=PersonNumber&amp;gt;='100001' and PersonNumber&amp;lt;='100500'"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two rules: &lt;code&gt;and&lt;/code&gt;/&lt;code&gt;or&lt;/code&gt; lowercase, and encode the expression exactly once (&lt;code&gt;--data-urlencode&lt;/code&gt; does this). Double-encoding is the classic cause of silently empty results.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Finder instead of q — faster lookups
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"user:pass"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?finder=findByPersonId;PersonId=300000001234567"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Syntax is &lt;code&gt;finder=&amp;lt;name&amp;gt;;&amp;lt;bindVar&amp;gt;=&amp;lt;value&amp;gt;&lt;/code&gt; — semicolon, not &lt;code&gt;&amp;amp;&lt;/code&gt;. Finders are pre-built indexed queries; &lt;code&gt;findByPersonId&lt;/code&gt; beats the equivalent &lt;code&gt;q&lt;/code&gt; filter every time. Bonus: &lt;code&gt;findReports;ManagerPersonId=...&lt;/code&gt; answers "who reports to this manager" with zero assignment traversal.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Cut the payload with &lt;code&gt;fields&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"user:pass"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='100001'&amp;amp;fields=PersonId,PersonNumber,DateOfBirth"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Routinely an 80–90% response-size cut on collections. The single easiest performance win in the whole API.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Inline child resources with &lt;code&gt;expand&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"user:pass"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='100001'&amp;amp;expand=names,workRelationships.assignments"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Names, emails, and assignments are children — by default you only get links. Dot notation reaches nested children. Avoid &lt;code&gt;expand=all&lt;/code&gt; on collections unless you enjoy timeouts.&lt;/p&gt;




&lt;p&gt;The full post has 12 examples — including calling child collections directly, error responses (400/401/403) and what they actually mean, and pagination loops: &lt;a href="https://opalapi.dev/blog/oracle-hcm-rest-api-examples/" rel="noopener noreferrer"&gt;Oracle HCM REST API Examples: 12 Real Requests You Can Copy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I build &lt;a href="https://opalapi.dev/" rel="noopener noreferrer"&gt;OPAL&lt;/a&gt;, an offline Oracle Fusion API explorer — 59,000+ HCM/FSCM endpoints searchable without internet, with visual &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-q-parameter/" rel="noopener noreferrer"&gt;q filter&lt;/a&gt; and finder builders and a full &lt;a href="https://opalapi.dev/apis/" rel="noopener noreferrer"&gt;endpoint reference&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>rest</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>"Oracle Fusion REST API Authentication: Basic Auth vs JWT vs OAuth 2.0"</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Sun, 12 Jul 2026 08:12:37 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/oracle-fusion-rest-api-authentication-basic-auth-vs-jwt-vs-oauth-20-4i79</link>
      <guid>https://dev.to/mostafamansour1/oracle-fusion-rest-api-authentication-basic-auth-vs-jwt-vs-oauth-20-4i79</guid>
      <description>&lt;p&gt;Every Oracle Fusion REST API call — HCM, Financials, or SCM — starts with the same question: how do I authenticate? Oracle supports three mechanisms, and picking the wrong one for your scenario is the most common reason integrations stall in week one.&lt;/p&gt;

&lt;p&gt;Here's the short version of each, when to use it, and the 401-vs-403 distinction that resolves most "authentication" tickets.&lt;/p&gt;

&lt;h2&gt;
  
  
  One rule first
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fusion authorization is always user-based.&lt;/strong&gt; Whatever method you choose, the token or credential resolves to a Fusion user, and that user's roles decide what the request can touch. There is no app-only access to business data — server-to-server flows run as a dedicated integration user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 1: Basic Auth over TLS
&lt;/h2&gt;

&lt;p&gt;Zero setup. Credentials travel base64-encoded in the &lt;code&gt;Authorization&lt;/code&gt; header on every request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s1"&gt;'integration.user@example.com:YourPassword'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?limit=5'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fine for development and quick internal scripts. Not great long-term: passwords expire on the pod's rotation policy (integrations break silently at 3 a.m.), and the header is the full identity — replayable if leaked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: JWT bearer with a trusted issuer
&lt;/h2&gt;

&lt;p&gt;The middle path. Your system signs a JWT with a private key; Fusion validates it against a certificate you uploaded once (Security Console → API Authentication). No identity-domain round trip per request, no password rotation problem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iss"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"www.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"integration.user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"integration.user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1780000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1780000900&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sign with RS256, send as &lt;code&gt;Authorization: Bearer &amp;lt;jwt&amp;gt;&lt;/code&gt;. The &lt;code&gt;prn&lt;/code&gt;/&lt;code&gt;sub&lt;/code&gt; claim must match an active Fusion username — that user's roles are what the request runs with. Keep &lt;code&gt;exp&lt;/code&gt; short; the token is self-contained, so a leaked one is valid until expiry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 3: OAuth 2.0 via IDCS / IAM
&lt;/h2&gt;

&lt;p&gt;The production-grade option, and required when a third party or federation (Entra ID, Okta) is involved. Register a confidential application in the identity domain linked to your Fusion instance, enable the grants you need, add the Fusion resource scope.&lt;/p&gt;

&lt;p&gt;Because Fusion needs a user context, pure client-credentials tokens are not enough for business-object APIs — server-to-server flows use the &lt;strong&gt;user assertion&lt;/strong&gt; variant: your app authenticates with its client credentials and asserts which Fusion user the token represents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;client_id&amp;gt;:&amp;lt;client_secret&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'assertion=&amp;lt;signed user-assertion JWT&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'scope=&amp;lt;fusion app scope&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://idcs-abc123.identity.oraclecloud.com/oauth2/v1/token'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The win over trusted-issuer JWT: central revocation, audit, token lifetime policy, and rotation live in the identity domain instead of your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  401 vs 403 — the distinction that saves hours
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;401 Unauthorized&lt;/strong&gt; — Fusion doesn't know who you are: wrong password, expired token, clock skew on &lt;code&gt;iat&lt;/code&gt;/&lt;code&gt;exp&lt;/code&gt;, issuer certificate not uploaded, malformed header.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;403 Forbidden&lt;/strong&gt; — Fusion knows who you are and says no: the integration user is missing the duty/job role for that resource, or data security scopes the user out of that business unit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;404 on a real endpoint&lt;/strong&gt; — sometimes authorization in disguise: a few resources return 404 instead of 403 when the user has no access. Check roles before doubting the URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If &lt;code&gt;/workers&lt;/code&gt; returns 403 but &lt;code&gt;/locations&lt;/code&gt; returns 200, your auth is fine — a role is missing. That's fixed in the Security Console, not in your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Proof of concept → Basic Auth&lt;/li&gt;
&lt;li&gt;Scheduled integration you own end-to-end → JWT trusted issuer&lt;/li&gt;
&lt;li&gt;Production, multiple consumers, federation, anything user-facing → OAuth 2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And always: a dedicated integration user with minimum roles. Never run integrations as a personal account, and never grant broad roles to "make the 403s go away."&lt;/p&gt;




&lt;p&gt;The full guide — with the complete setup steps, header examples, and troubleshooting table — is on our blog: &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-authentication/" rel="noopener noreferrer"&gt;Oracle Fusion REST API Authentication&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I build &lt;a href="https://opalapi.dev/" rel="noopener noreferrer"&gt;OPAL&lt;/a&gt;, an offline Oracle Fusion API explorer — 59,000+ HCM/FSCM endpoints searchable without internet, with visual &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-q-parameter/" rel="noopener noreferrer"&gt;q filter&lt;/a&gt; and finder builders and a full &lt;a href="https://opalapi.dev/apis/" rel="noopener noreferrer"&gt;endpoint reference&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why the Oracle Fusion REST API q Parameter Fails and How to Fix It</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Sat, 11 Jul 2026 08:02:05 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/why-the-oracle-fusion-rest-api-q-parameter-fails-and-how-to-fix-it-1847</link>
      <guid>https://dev.to/mostafamansour1/why-the-oracle-fusion-rest-api-q-parameter-fails-and-how-to-fix-it-1847</guid>
      <description>&lt;p&gt;The &lt;code&gt;q&lt;/code&gt; parameter is one of the most useful parts of Oracle Fusion REST APIs. It lets you filter records directly from the API instead of retrieving a large result set and filtering it later in your integration layer.&lt;/p&gt;

&lt;p&gt;It is also one of the most common reasons Fusion API calls fail.&lt;/p&gt;

&lt;p&gt;A request that looks correct can still return an error like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The query parameter is invalid.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid query expression.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or sometimes the request succeeds but the response is not filtered the way you expected.&lt;/p&gt;

&lt;p&gt;This usually happens because Oracle Fusion REST filtering is not the same as SQL filtering. The &lt;code&gt;q&lt;/code&gt; parameter only works with fields and operators that are supported by the specific REST resource you are calling.&lt;/p&gt;

&lt;p&gt;This guide explains the most common reasons the &lt;code&gt;q&lt;/code&gt; parameter fails and how to troubleshoot it correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is the q parameter in Oracle Fusion REST APIs?
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;q&lt;/code&gt; parameter is used to filter records in Oracle Fusion REST API requests.&lt;/p&gt;

&lt;p&gt;A simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another example from Financials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /fscmRestApi/resources/11.13.18.05/invoices?q=InvoiceNumber='INV-1001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The general pattern is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;q=FieldName operator value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Common operators include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=
!=
&amp;gt;
&amp;lt;
&amp;gt;=
&amp;lt;=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some endpoints also support operators such as &lt;code&gt;LIKE&lt;/code&gt;, &lt;code&gt;BETWEEN&lt;/code&gt;, or null checks, but support is not universal. You must confirm what the specific endpoint accepts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the q parameter fails
&lt;/h2&gt;

&lt;p&gt;Most &lt;code&gt;q&lt;/code&gt; issues come from one of these causes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The field is not queryable.&lt;/li&gt;
&lt;li&gt;The field belongs to a child resource.&lt;/li&gt;
&lt;li&gt;The field name is wrong.&lt;/li&gt;
&lt;li&gt;The value format is wrong.&lt;/li&gt;
&lt;li&gt;The operator is not supported for that field.&lt;/li&gt;
&lt;li&gt;The filter is being applied at the wrong API level.&lt;/li&gt;
&lt;li&gt;The endpoint expects a finder instead of a normal &lt;code&gt;q&lt;/code&gt; filter.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's go through each one.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The field is not queryable
&lt;/h2&gt;

&lt;p&gt;Not every field returned by a REST API response can be used inside &lt;code&gt;q&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is one of the biggest surprises for Fusion developers.&lt;/p&gt;

&lt;p&gt;You may see a field in the response, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"PersonNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"DisplayName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Test Employee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"HireDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-01"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But that does not automatically mean all three fields are valid in &lt;code&gt;q&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This may work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this may fail depending on the endpoint metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=HireDate='2024-01-01'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response field and the queryable field list are not always the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;p&gt;Before writing the filter, check whether the field is queryable for that REST resource.&lt;/p&gt;

&lt;p&gt;You can do that by reviewing the OpenAPI metadata or the Oracle REST documentation for that resource. If the field is not listed as queryable, use another field, a finder, or a lower-level child endpoint.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The field belongs to a child resource
&lt;/h2&gt;

&lt;p&gt;This is very common with the Workers API.&lt;/p&gt;

&lt;p&gt;For example, you may want active employee assignments only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AssignmentType = 'E'
AssignmentStatusType = 'ACTIVE'
PrimaryFlag = true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But these fields usually belong to the worker assignment child resource, not the top-level worker resource.&lt;/p&gt;

&lt;p&gt;This kind of request may not work as expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=AssignmentStatusType='ACTIVE'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because &lt;code&gt;/workers&lt;/code&gt; filters workers at the worker level. It does not always filter nested child records such as work relationships or assignments.&lt;/p&gt;

&lt;p&gt;Even if you use &lt;code&gt;expand&lt;/code&gt;, the &lt;code&gt;q&lt;/code&gt; filter is still applied to the parent resource unless Oracle explicitly supports filtering the child resource in that call.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='10001'&amp;amp;expand=workRelationships.assignments
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can return the worker and expand assignments, but it does not mean you can filter the assignment rows from the parent &lt;code&gt;q&lt;/code&gt; parameter.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;p&gt;Call the child resource directly when you need child-level filtering.&lt;/p&gt;

&lt;p&gt;The pattern is usually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers/{workersUniqID}/child/workRelationships/{workRelationshipsUniqID}/child/assignments?q=AssignmentStatusType='ACTIVE'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more work because you may need parent IDs first, but the filter is applied at the correct resource level.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The field name is wrong
&lt;/h2&gt;

&lt;p&gt;Oracle Fusion REST field names are case-sensitive in many contexts.&lt;/p&gt;

&lt;p&gt;This can fail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=personnumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the correct style:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=PersonNumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same applies to fields such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;InvoiceNumber
BusinessUnit
PersonId
AssignmentId
DocumentType
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Small spelling or casing differences can break the filter.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;p&gt;Copy the exact field name from the REST metadata or from a working response. Do not guess field names from the Fusion UI label.&lt;/p&gt;

&lt;p&gt;For example, the UI may say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Person Number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the API field may be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PersonNumber
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. The value format is wrong
&lt;/h2&gt;

&lt;p&gt;String values normally need quotes.&lt;/p&gt;

&lt;p&gt;Correct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=PersonNumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Risky or invalid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=PersonNumber=10001
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For dates, use the format expected by the API. In many cases, ISO date format is safest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=CreationDate&amp;gt;='2026-01-01'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For booleans, check the endpoint behavior. Some APIs use true/false, while others expose Y/N, flags, or lookup codes.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=PrimaryFlag=true
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=StatusCode='Y'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The correct value depends on the field definition.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The operator is not supported
&lt;/h2&gt;

&lt;p&gt;Developers often try SQL-style expressions in Oracle Fusion REST APIs.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=DisplayName LIKE '%John%'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may not work on every endpoint.&lt;/p&gt;

&lt;p&gt;Even when &lt;code&gt;LIKE&lt;/code&gt; works in one REST resource, it may not work in another. Oracle Fusion REST APIs are large, and behavior can vary by module and resource.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;p&gt;Start with simple equality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=DisplayName='John Smith'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test other operators only after confirming the field supports them.&lt;/p&gt;

&lt;p&gt;If partial search is required, check whether the endpoint provides a finder that supports keyword-style search.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Null checks can be sensitive
&lt;/h2&gt;

&lt;p&gt;Another common issue is filtering null values.&lt;/p&gt;

&lt;p&gt;Developers may try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=InactiveDate is null
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=InactiveDate=null
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whether this works depends on the resource and supported query syntax. Some resources support null-style filtering. Others do not.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;p&gt;Check the supported query operators for that endpoint. If null filtering is not supported, you may need to retrieve a smaller set of records using another condition, then filter null values in your integration layer.&lt;/p&gt;

&lt;p&gt;Not perfect, but better than pulling the full dataset without any filter.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. You may need a finder instead of q
&lt;/h2&gt;

&lt;p&gt;Oracle Fusion REST APIs often expose named finders.&lt;/p&gt;

&lt;p&gt;A finder is a predefined search pattern with specific parameters.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?finder=findByPersonId;PersonId=300000123456789
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finders can be more reliable than &lt;code&gt;q&lt;/code&gt; when Oracle has already defined the intended search path.&lt;/p&gt;

&lt;p&gt;If a &lt;code&gt;q&lt;/code&gt; filter keeps failing, check whether the endpoint has a finder for the same business scenario.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical troubleshooting checklist
&lt;/h2&gt;

&lt;p&gt;When a &lt;code&gt;q&lt;/code&gt; filter does not work, follow this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm the endpoint is correct.&lt;/li&gt;
&lt;li&gt;Confirm the field belongs to that exact resource, not a child resource.&lt;/li&gt;
&lt;li&gt;Confirm the field is queryable.&lt;/li&gt;
&lt;li&gt;Confirm the exact field name and casing.&lt;/li&gt;
&lt;li&gt;Confirm the value format.&lt;/li&gt;
&lt;li&gt;Start with one filter condition only.&lt;/li&gt;
&lt;li&gt;Add additional conditions one by one.&lt;/li&gt;
&lt;li&gt;Check whether a finder exists.&lt;/li&gt;
&lt;li&gt;Test the child endpoint directly if filtering child data.&lt;/li&gt;
&lt;li&gt;Only filter in the integration layer after reducing the response as much as possible.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Example: Workers API q filter
&lt;/h2&gt;

&lt;p&gt;A simple worker lookup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need assignment-level conditions, do not assume this will work from the parent worker resource:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=AssignmentStatusType='ACTIVE'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, inspect the worker child resources and test the assignments child endpoint.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: Invoices API q filter
&lt;/h2&gt;

&lt;p&gt;A common invoice lookup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /fscmRestApi/resources/11.13.18.05/invoices?q=InvoiceNumber='INV-1001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need invoice attachments, use &lt;code&gt;expand&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /fscmRestApi/resources/11.13.18.05/invoices?q=InvoiceNumber='INV-1001'&amp;amp;expand=attachments
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But remember: expanding attachments does not mean the parent &lt;code&gt;q&lt;/code&gt; filter can filter attachment fields.&lt;/p&gt;




&lt;h2&gt;
  
  
  How OPAL helps
&lt;/h2&gt;

&lt;p&gt;OPAL is built for this exact workflow.&lt;/p&gt;

&lt;p&gt;Instead of guessing the &lt;code&gt;q&lt;/code&gt; syntax from documentation pages, OPAL lets you search Oracle Fusion REST endpoints, inspect available query fields, check finders, browse child resources, and test the request directly against your Fusion environment.&lt;/p&gt;

&lt;p&gt;This is especially useful when working with large APIs like Workers, Invoices, Purchase Orders, Document Records, Learning, or Procurement resources.&lt;/p&gt;

&lt;p&gt;You can download OPAL here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opalapi.dev" rel="noopener noreferrer"&gt;https://opalapi.dev&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final recommendation
&lt;/h2&gt;

&lt;p&gt;Do not treat the &lt;code&gt;q&lt;/code&gt; parameter like SQL.&lt;/p&gt;

&lt;p&gt;Treat it as a resource-specific filter syntax.&lt;/p&gt;

&lt;p&gt;The safest approach is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the exact REST resource.&lt;/li&gt;
&lt;li&gt;Check the queryable fields.&lt;/li&gt;
&lt;li&gt;Avoid filtering child data from the parent endpoint.&lt;/li&gt;
&lt;li&gt;Use finders when available.&lt;/li&gt;
&lt;li&gt;Test small filters first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will save a lot of time and reduce unnecessary trial and error in Postman or integration tools.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is part of our complete &lt;a href="https://opalapi.dev/oracle-hcm-api/" rel="noopener noreferrer"&gt;Oracle HCM API guide&lt;/a&gt; — base URLs, authentication, &lt;code&gt;q&lt;/code&gt; filters, finders, key endpoints, and common errors in one place.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-q-parameter/" rel="noopener noreferrer"&gt;opalapi.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>rest</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
