# Quickbase API Pitfalls
Non-obvious issues discovered through live API testing that cause subtle bugs.
## Relationship Endpoint Pluralization
The Relationships API uses **different pluralization** for read vs write:
| Operation | Method | Path |
|-----------|--------|------|
| Get relationships | GET | `/tables/{tableId}/relationships` (plural) |
| Create relationship | POST | `/tables/{tableId}/relationship` (singular) |
| Update relationship | POST | `/tables/{tableId}/relationship/{id}` (singular) |
| Delete relationship | DELETE | `/tables/{tableId}/relationship/{id}` (singular) |
Using the wrong form returns HTTP 404. The official docs don't clearly call this out. Verified against [node-quickbase](https://github.com/tflanagan/node-quickbase) (autogenerated from the OpenAPI spec).
See also: `src/tools/relationships/CLAUDE.md`
## Field Deletion API Format
`DELETE /fields` uses a **query parameter** for `tableId` and a **body** for `fieldIds` array:
```
DELETE /fields?tableId={tableId}
Body: { "fieldIds": [fieldId] }
```
This is unusual — most Quickbase endpoints use path parameters for table IDs.
## create_table Does NOT Support Inline Field Creation
Despite what older docs may suggest, passing a `fields` array to the create table endpoint does not create fields. Fields must be created separately with individual `create_field` calls after table creation.
## Field Help Text vs Description
When creating fields, the Quickbase API uses `fieldHelp` (not `description`) for the field's help text. Using `description` silently does nothing.
## update_field Does NOT Support field_type
You cannot change a field's type after creation. The `field_type` parameter is silently ignored by the API on update operations.
## System Fields (IDs 1-5) Are Immutable
Field IDs 1-5 are system fields (Record ID, Date Created, Date Modified, Record Owner, Last Modified By). They cannot be deleted or have their type changed. `delete_field` has explicit protection for this.
## OrderBy fieldId Is a String, GroupBy fieldId Is a Number
In `query_records`, `orderBy[].fieldId` is a **string** while `groupBy[].fieldId` is a **number**. This inconsistency comes from the Quickbase API itself. Both refer to the same field IDs.