Download OpenAPI specification:
The Ragic REST API allows you to query, create, update, and delete data programmatically. All API requests must be made over HTTPS.
The Ragic HTTP API is a REST-style interface that lets you read, create, update, and delete records on any Ragic form. You can use any HTTP client — cURL, Postman, or your programming language's HTTP library.
The Ragic REST API allows you to query any data that you have on Ragic, or to execute create / update / delete operations programmatically to integrate with your own applications. Since the API is based on REST principles, it's very easy to write and test applications. You can use your browser to access URLs, and you can use pretty much any HTTP client in any programming language to interact with the API. HTTP requests can be issued with two content types, form data and JSON. However, for file uploads, form data is the only option.
You can test most GET method APIs easily by entering API endpoint URLs in your browser. For example, you can try the following URL to access customer account information on the Ragic demo:
https://www.ragic.com/demo/sales/1?api
Note that you may need to modify www to na3 , ap5 , or eu2 in your URL based on your Ragic account URL. But it's not as easy to create POST method requests on your browser, so we recommend a tool called cURL for you to create all types of HTTP requests you want to test our API. Our document will also be using cURL commands as samples API calls, but you can also use any tool that you're familiar with to create HTTP requests and parse responses. You can download cURL for your platform at https://curl.haxx.se/download.html , and you can also read its full documentation at https://curl.haxx.se/docs/manpage.html . But don't worry, we'll tell you about the necessary usages of cURL as we explain the Ragic HTTP API. After you have downloaded cURL, you can use the following command to access the same endpoint we described above, and you should see the same output as you would in a browser.
curl https://www.ragic.com/demo/sales/1?api
Please note that when using CURL, -d does not encode the content as URL string. If your string content has characters like % or & please use the option --data-urlencode instead of -d.
Postman is a tool that helps to send HTTP requests without having to code. You can see Postman’s documentation here, and Postman can be downloaded here. Postman is recommended for users with little technical experience, and the fundamentals will be introduced in this tutorial. The user interface for Postman looks like the image below: 
For the image above, the HTTP request is a GET request, and it is being sent to https://www.ragic.com/demo/sales/1 with a query parameter "api" that has no value attached to it. The image below shows the list of HTTP methods from the dropdown menu. 
In a lot of cases you need to find a Field ID for a field. The field id is an unique number that Ragic assigns to each field that you created. It gives your program an unambiguous way to refer to a field. With this design, fields can even have the same name under a sheet and Ragic will still be able to distinguish between them. Right-click on any sheet name and select Javascript Workflow to view the Field IDs associated with each field in the sheet.
Alternatively, you can go to the design mode, and click on the field you want to reference to. On the left sidebar, you're going to see the Field Name. The Field ID is right under the Field Name.
For other ways to find Field IDs , please refer to this article.
You can find the API endpoint for your Ragic form or entry by passing api as a query string parameter to specify this is an API request.
https://www.ragic.com/{ACCOUNT_NAME}>/{TAB_FOLDER}>/{SHEET_INDEX}/{RECORD_ID}?v=3&api
Please Note:
It's a good practice to specify the API version every time you send your request to ensure a correct version. If the version is not specified, the latest version will be used, but unexpected changes to the API may cause problems in your application. For example if you usually access your Ragic form using the following URL:
https://www.ragic.com/demo/sales/1
Its HTTP API endpoint URL would be:
https://www.ragic.com/demo/sales/1?v=3&api
Or for a single entry in your form, you would include an id (for example record id of 1) to specify an entry:
https://www.ragic.com/demo/sales/1/1
Its corresponding HTTP API endpoint URL is simply:
https://www.ragic.com/demo/sales/1/1?v=3&api
We don't have a limit on our API calls as long as it's under reasonable use. If you're not sure about your use, feel free to just drop us a message at support@ragic.com to check with us. While there is no limit on API usage, there is a queue mechanism for each database account. The maximum size of the queue is 50, and it stops accepting API requests when it is full. Therefore, we encourage waiting for the response of one request before sending another. Note that this limit currently only applies to GET API requests. This is only to ensure reasonable use of our system, so that there will not be disproportionately heavy use in smaller accounts. A manual review process will be triggered, if the usage exceeds 5 requests per second, to determine whether throttling will be applied.
Currently, the API uses a date-based parameter for versioning while remaining compatible with the legacy numeric versions. The API supports the following two versioning mechanisms:
The recommended format is a date string, for example: version=2025-01-01. All future API versions will only support the date-based format.
Legacy versions use numeric parameters, for example: v=1 , v=2 , v=3. Legacy versions remain supported but are not recommended for new integrations.
| Version Parameter | Notes |
|---|---|
| (no equivalent) | v=1 |
| (no equivalent) | v=2 |
| version=2025-01-01 | Equivalent to v=3. Latest version. |
If no version parameter is specified in the request, the API will default to the latest version.
You authenticate to the Ragic API by providing one of your API keys in the request. Your API keys carry many privileges, so be sure to keep them secret! Because when your code accesses Ragic via an API key, it will basically log in as the user of the API key and execute read write as this user. We highly recommend creating a separate user for API key access. This way the API access will not be mixed with a organizational user, which will make the system audit trail much clearer and debugging of your API program much easier. Authentication to the API occurs via HTTP Basic Auth. Provide your API key as the basic auth username. You do not need to provide a password. All API requests must be made over HTTPS. Calls made over plain HTTP will fail. You must authenticate for all requests.
curl https://www.ragic.com/demo/sales/1\
--get -d api \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE"
Note that the HTTP header name is Authorization, and the value is your API key preceded with "Basic ", Basic with a space at the end, and you may need to modify www to na3 , ap5 , or eu2 in your URL based on your Ragic account URL. You can generate your API key in Personal Settings.
Most HTTP clients (including web-browsers) present a dialog or prompt for you to provide a username and password (empty) for HTTP basic auth. Most clients will also allow you to provide credentials in the URL itself. If for some reason that you are not able to send the API key as HTTP header or basic authorization, you can send the API key as a parameter with the name APIKey. You will need to add this parameter for every single request you send.
curl https://www.ragic.com/demo/sales/1\
--get -d api \
-d "APIKey=YOUR_API_KEY_GOES_HERE"

Sometimes if your platform does not support HTTP Basic authentication, you can pass the user's e-mail and password as log in credentials to authenticate your program. If you registered through Sign in with Google, make sure to register a Ragic password before proceeding with this tutorial. Please only use this when you can not authenticate with HTTP Basic Authentication. You send a request for a session id with a valid e-mail and password. You can issue a HTTP request using the -d argument containing the id and password. The -c parameter will store sessionId in the cookie jar file specified:
curl --get -d "u=jeff@ragic.com" \
--data-urlencode "p=123456" \
-d "login_type=sessionId" \
-d api \
-c cookie.txt \
-k \
https://www.ragic.com/AUTH
If authentication failed, server will return -1. If authenticated, you will receive a session id in the response like this:
2z5u940y2tnkes4zm49t2d4
Note that this authentication method is session based, and session is server dependent. You may need to modify the url based on the location of the account you wish to access. For example, https://ap8.ragic.com/AUTH for accounts that reside on server https://ap8.ragic.com. **To use the returned sessionId in future requests to remain authenticated, please include the sessionId in url parameter as sid= For example, https://www.ragic.com/demo/sales/1?sid= The use of Ragic API will be covered in later chapters, just remember to include your session ID in this manner to remain authenticated. ** If you would like to retrieve detailed info on the log in user, you can also provide an additional json=1 parameter so that Ragic will return a json object containing the details of the user.
curl --get -d "u=jeff@ragic.com" \
--data-urlencode "p=123456" \
-d "login_type=sessionId" \
-d "json=1" \
-d api \
-c cookie.txt \
-k \
https://www.ragic.com/AUTH
The returned format will look something like this:
{
"sid":"8xkz874fdftl116vkd3wgjq0t",
"email":"jeff@ragic.com",
"accounts":
{
"account":"demo",
"ragicId":25,
"external":false,
"groups":["EVERYONE","SYSADMIN"]
}
}
Authenticate a user with email and password to obtain a session ID. This is a secondary authentication method; HTTP Basic Auth with API keys is recommended for most use cases.
No authentication headers are needed for this endpoint — it IS the authentication endpoint.
Basic usage (returns session ID as plain text):
curl "https://www.ragic.com/AUTH?u=user@example.com&p=mypassword&api"
With JSON response (includes account list):
curl "https://www.ragic.com/AUTH?u=user@example.com&p=mypassword&json=1&api"
JSON Response:
{
"status": "SUCCESS",
"sid": "abc123def456",
"email": "user@example.com",
"accounts": ["myaccount", "otheraccount"]
}
Using the session ID: Pass the returned session ID as a cookie (JSESSIONID) or use login_type=sessionId to get a session-based cookie directly.
| u required | string Example: u=user@example.com |
| p required | string Example: p=password123 |
| login_type | string Value: "sessionId" |
| json | integer Value: 1 |
| api | string |
abc123def456
For example, this is the API response for https://www.ragic.com/demo/sales/1?v=3 &api. Remember to specify your cookie jar file in the call like "-b cookie.txt"
{
"1":{
"_ragicId": 1,
"_star": false,
"Account Name": "Alphabet Inc.",
"_index_title_": "Alphabet Inc.",
"Short Name": "",
"Account ID": "C-00002",
"EIN / VAT Number": "",
...
...
},
"0":{
"_ragicId": 0,
"_star": false,
"Account Name": "Ragic, Inc.",
"_index_title_": "Ragic, Inc.",
"Short Name": "Ragic",
"Account ID": "C-00001",
"EIN / VAT Number": "",
...
...
The listing is defaulted to 1000 entries. You can add paging parameter limit according to the following sections to get more entries. The data in the subtables are displayed as the sample below. The attribute name is subtable followed by the subtable ID to identify which subtable it is. The content of the subtable is presented the same way as the fields in a form.
"_subtable_2000154": {
"0": {
"_ragicId": 0,
"Contact Name": "Jeff Kuo",
"Title": "Technical Manager",
"Phone": "886-668-037",
},
"1": {
"Contact Name": "Amy Tsai",
"Title": "Marketing",
"Phone": "",
},
If your application does not need the data in the subtables, you can add the parameter subtables=0 to turn off the fetching of subtable data. The comments of the entries is retrieved as subtables also. It will be retrieved in a subtable with the field id of 61, but you will need to add parameter comment=true when retrieving data for comment data to be returned.
Retrieve a list of records from a form/sheet.
The listing is defaulted to 1000 entries. You can add paging parameters limit and offset to specify how many entries that you would like to retrieve, and how many entries that you would like to skip.
Example: Get records with pagination
curl -H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
"https://www.ragic.com/demo/sales/1?api&limit=50&offset=0"
Use subtables=0 parameter to exclude subtable data for faster response.
When a mass operation returns a taskId, you can check its progress by passing the taskId query parameter to this endpoint.
Example:
curl -H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
"https://www.ragic.com/demo/sales/1?api&taskId=550e8400-e29b-41d4-a716-446655440000"
Response:
{
"status": "RUNNING",
"progress": 45,
"total": 100,
"message": "Processing records..."
}
When status is COMPLETED or FAILED, the task is finished.
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| where | Array of strings Examples:
Filter condition with comma-delimited arguments. Format: Available Operands:
Multiple "eq", "regex", or "like" conditions on the same field act as OR operations. Combining gte/gt and lte/lt conditions on the same field creates AND operations (useful for date ranges). Date/datetime values must use format: Empty value filtering: leave third argument blank, e.g., Commas in filter values require URL encoding ( Double URL encoding: If a filter value contains Example: |
| fts | string Example: fts=search term Full-text search for keyword matching across all searchable fields. Example: |
| limit | string Examples:
Specify how many entries that you would like to retrieve. Returned data is defaulted to 1000 entries, you will need to provide limit parameters if you want your response to have more than 1000 entries. Example: |
| offset | integer Example: offset=0 Specify how many entries that you would like to skip. Use with limit for pagination. For example, to skip the first 5 entries and return entries 6-13 (a total of 8 entries): |
| order | string Examples:
Sort order. Format: By default, data is ordered by creation date and time, from oldest to latest entry. Example: |
| reverse | string Value: "true" Reverse the default ordering of the listing page response. To retrieve the most recent entries first, use Example: |
| subtables | string Default: "1" Include subtable data in the response.
|
| listing | string Return only the fields configured to appear in the sheet's list view (the columns visible when browsing records in Ragic). Use this when building a table/list UI where you don't need every field — the response is smaller and faster.
|
| naming | string Enum: "EID" "FNAME" Choose how fields are named in the response JSON keys.
|
| info | string Include record metadata (who created/modified it and when). Useful for audit logs or sync operations.
|
| ignoreMask | string Some fields in Ragic can be configured to mask sensitive data (e.g., showing a phone number as
|
| ignoreFixedFilter | string Value: "true" Fixed filters are permanent filters set by the form designer that restrict which records all users can see (e.g., "only show active customers"). This parameter bypasses them. Requires SYSAdmin privileges.
|
| filterId | integer Apply a saved filter by its ID. Saved filters are pre-configured search criteria created in the Ragic UI (accessible from the filter dropdown on any sheet). Use this instead of building complex |
| defaultFilter | string Apply the sheet's default filter (a pre-configured filter set by the form designer in form settings). This returns the same filtered results users see by default in the Ragic UI.
|
| bbcode | string Value: "true" Ragic rich-text fields store formatting in BBCode syntax (e.g.,
|
| comment | string Include the comment/note thread attached to each record. Comments are discussion notes that users add via the Ragic UI.
|
| history | string Include the field change history for each record — a log of who changed which field, when, and what the old/new values were. Useful for audit trails.
|
| approval | string Include approval workflow status. Ragic's approval feature lets you set up multi-step sign-off processes for records. This returns the current approval status, approver list, and approval history.
|
| conversation | string Include the email conversation thread tied to a record. When records have associated email threads (via Ragic's email features), this returns those messages.
|
| tz | number Example: tz=-8 Timezone offset in hours for date/time fields. Example: Date values in the response will be adjusted to this timezone. |
| version | string Example: version=2025-01-01 API version using date-based versioning (recommended). Format: Using versioning ensures your integration remains stable when Ragic introduces breaking changes. The API will behave according to the version you specify. Example: |
| v | integer Enum: 1 2 3 Legacy API version number. Use
|
| taskId | string <uuid> Check the progress of an asynchronous mass operation. Pass the task ID returned by a mass operation endpoint. Example: |
| api | string API key for authentication (alternative to HTTP Basic Auth). Example: |
| callback | string JSONP callback function name. Adding a callback function parameter will enclose the returned JSON object as an argument in a call to the callback function specified by you. This is particularly valuable when you're accessing our API using Javascript for cross domain ajax calls. Example: Response will be wrapped: |
{- "12345": {
- "1000001": "Acme Corp",
- "1000002": "2024-01-15",
- "1000003": "Active",
- "_ragicId": 12345
}, - "12346": {
- "1000001": "Beta Inc",
- "1000002": "2024-01-16",
- "1000003": "Pending",
- "_ragicId": 12346
}
}Retrieve a specific record by its ID (rootNodeId).
Example: Get record #12345
curl -H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
"https://www.ragic.com/demo/sales/1/12345?api"
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| rootNodeId required | integer Example: 12345 The record ID from your URL (shown when viewing a single record) |
| subtables | string Default: "1" Include subtable data in the response.
|
| naming | string Enum: "EID" "FNAME" Choose how fields are named in the response JSON keys.
|
| info | string Include record metadata (who created/modified it and when). Useful for audit logs or sync operations.
|
| ignoreMask | string Some fields in Ragic can be configured to mask sensitive data (e.g., showing a phone number as
|
| bbcode | string Value: "true" Ragic rich-text fields store formatting in BBCode syntax (e.g.,
|
| comment | string Include the comment/note thread attached to each record. Comments are discussion notes that users add via the Ragic UI.
|
| history | string Include the field change history for each record — a log of who changed which field, when, and what the old/new values were. Useful for audit trails.
|
| approval | string Include approval workflow status. Ragic's approval feature lets you set up multi-step sign-off processes for records. This returns the current approval status, approver list, and approval history.
|
| conversation | string Include the email conversation thread tied to a record. When records have associated email threads (via Ragic's email features), this returns those messages.
|
| tz | number Example: tz=-8 Timezone offset in hours for date/time fields. Example: Date values in the response will be adjusted to this timezone. |
| version | string Example: version=2025-01-01 API version using date-based versioning (recommended). Format: Using versioning ensures your integration remains stable when Ragic introduces breaking changes. The API will behave according to the version you specify. Example: |
| v | integer Enum: 1 2 3 Legacy API version number. Use
|
| api | string API key for authentication (alternative to HTTP Basic Auth). Example: |
{- "12345": {
- "1000001": "Acme Corp",
- "1000002": "2024-01-15",
- "_ragicId": 12345
}
}Very often your database contains a large amount of entries, so it's better to apply filters when you retrieve data. Ragic API filters are in a special format You can use the parameter "where" to add a filter condition to a query as below:
curl --get -d "where=2000123,eq,Alphabet Inc." \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
-d api \
https://www.ragic.com/demo/sales/1
The parameter is a "," comma delimited format, with at least 3 arguments.
You can supply a query with multiple filter conditions as below:
curl --get -d "where=2000123,eq,Alphabet Inc." \
-d "where=2000127,eq,Jeff Kuo" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
-d api \
https://www.ragic.com/demo/sales/1
Here's the list of operands that you can use:
| Operand Name | Operand Value |
|---|---|
| Equals | eq |
| Regular Expression | regex |
| Greater or equals | gte |
| Less or equals | lte |
| Greater | gt |
| Less | lt |
| Contains | like |
| Equals a node id | eqeq |
Please note that:
There are some system fields that has special field ids that you can use in your query. Common system fields listed below:
| System field name | Field id |
|---|---|
| Create Date | 105 |
| Entry Manager | 106 |
| Create User | 108 |
| Last Update Date | 109 |
| Notify User | 110 |
| If Locked | 111 |
| If Starred | 112 |
You can also use a full text search as a query filter. Just provide your query term in the parameter fts and the matched result will be returned.
curl --get -d "fts=Alphabet" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
-d api \
https://www.ragic.com/demo/sales/1
You can also apply Shared View. Just set the id as below.
curl --get -d "filterId=YOUR_SHARED_VIEW_ID" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
-d api \
https://www.ragic.com/demo/sales/1
You could get the id by clicking the Shared View URL. 
Very often you do not want to fetch all entries with one request, you can use the limit and offset parameters to specify how many entries that you would like to retrieve, and how many entries that you would like to skip at the start, so clients can implement pages for viewing entries. The usage of limit and offset parameters is similiar to SQL limit parameter. Offset is how many entries that you would like to skip in the beginning, and limit is how many entries that you would like to be returned. Returned data is defaulted to 1000 entries , you will need to provide limit parameters if you want your response to have more than 1000 entries. The format is as follows:
limit=<limit>&offset=<offset>
</offset></limit>
The offset parameter is the number of entries that should be skipped before returning, used for going through pages that has been retrieved. The limit parameter is the max number of records that should be returned per call. For example the below call will skip the first 5 entries, and return 6 ~ 13, a total of 8 entries.
curl --get -d "limit=8" \
-d "offset=5" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
-d api \
https://www.ragic.com/demo/sales/1

Without any ordering, the data is by default ordered by creation date and time, from oldest to latest. If you would like to have the latest result first, you can specify reverse=true like this:
curl --get -d "reverse=true" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
-d api \
https://www.ragic.com/demo/sales/1
You can also specify how the entries are ordered by adding the order parameter. It's also kind of similar to the ORDER BY clause in SQL, its value is a comma separated string with two arguments. The first one is the field id of the domain that you would like the entries to be sorted according to, and the second one is the order: either ASC for ascending order, or DESC for descending order.
curl --get -d "order=800236,DESC" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
-d api \
https://www.ragic.com/demo/sales/1

Adding a callback function parameter will enclose the returned JSON object as a argument in a call to the callback function specified by you. This is especially useful when you're accessing our API using Javascript, you may need this to do cross domain ajax calls. For example, adding callback=testFunc as below:
curl --get -d "callback=testFunc" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
-d api \
https://www.ragic.com/demo/sales/1
Will enclose the returned JSON object in a function call so you can process the returned data in your callback function:
testFunc({"17": {
"Account Name": "Dunder Mifflin",
"Account Owner": "Jim Halpert",
"Phone": "1-267-922-5599",
...
...
});
The JSON data format uses the field name string as the attribute name, you can use a "naming" parameter to specify that you would like to use field id as the attribute name to identify a field. Possible values include: EID (Field Id), FNAME (Field Name).
curl --get -d "naming=EID" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
-d api \
https://www.ragic.com/demo/sales/1

There are several other useful parameters that you can apply to your HTTP GET request to change the content of the response:
| Parameter Name | Description |
|---|---|
| subtables | Specifying subtables=0 tells Ragic API to not include subtable information in the response. |
| listing | Specifying listing=true tells Ragic API to only include fields in the Listing Page. |
| reverse | Specifying reverse=true tells Ragic API to reverse the default ordering of the listing page response. |
| info | Adding the info=true parameter will add "Create Date", "Create User" information to the response |
| conversation | Adding the conversation=true parameter will add the email conversation information related to this record to the response |
| approval | Adding the approval=true parameter will add the approval information related to this record to the response |
| comment | Adding the comment=true parameter will add the comment thread related to this record to the response |
| bbcode | Adding the bbcode=true parameter will retrieve the raw BBCode value saved to the field instead of being translated to HTML |
| history | Adding the history=true parameter will add the edit history related to this record to the response. |
| Edit Histories are in the form of JSON, which contains information about the time, type, sheet, user, detail. |
CODEBLOCK_0_PLACEHOLDER | | ignoreMask | When ignoreMask=true is given, the field value of "Masked text" will be unmasked if you are in the viewable groups. Click here for more information about "Masked text" field. | | ignoreFixedFilter | When ignoreFixedFilter=true is given, the fixed filter on this sheet will be ignored. But note that this will only work when the API call API key user has the SYSAdmin privilege. |
On the JSON returned by your HTTP API call, you will see something like this for file upload field or image upload fields:
"1000537": "Ni92W2luv@My_Picture.jpg",
You will be able to download the file using a separate call like this (assuming your account name is "demo" and API call url being https://www.ragic.com/demo/sales/1?v=3&api) :
https://www.ragic.com/sims/file.jsp?a=demo&f=Ni92W2luv@My_Picture.jpg
The format is:
https://www.ragic.com/sims/file.jsp?a=< account name >&f=< file name >
Remember to encode your file name when you send it as an URL. Your actual file name will start after the @ character, this is to avoid file name collision.
Download an uploaded file, image, or email attachment.
File references appear in JSON responses with format: "1000537": "Ni92W2luv@My_Picture.jpg"
The actual filename follows the "@" character to prevent naming collisions.
Example: Download a file
curl "https://www.ragic.com/sims/file.jsp?a=demo&f=Ni92W2luv@My_Picture.jpg"
Note: File names must be URL-encoded when sent as parameters.
| a required | string Example: a=demo |
| f required | string Example: f=Ni92W2luv@My_Picture.jpg |
{- "status": "ERROR",
- "errorCode": 104,
- "msg": "The record you are updating is not found."
}For example, if you have an URL to the record as follows
https://www.ragic.com/demo/sales/1/41
You can retrieve an HTML printer friendly version like this, by adding a .xhtml to the end:
https://www.ragic.com/demo/sales/1/41.xhtml
You can add a .pdf for a PDF version, .xlsx for an Excel version:
https://www.ragic.com/demo/sales/1/41.pdf
https://www.ragic.com/demo/sales/1/41.xlsx
You can retrieve a Mail Merge of a record, by adding .custom? and a Mail Merge CID to specify which template (which is 1 for the mail merge template used in this case):
https://www.ragic.com/demo/sales/1/41.custom?cid=1
To obtain the cid of a mail merge, you can manually download a mail merge from the Ragic user interface first, and pay attention to the cid parameter in the download url.
https://www.ragic.com/demo/sales/1/41.custom?rn=41&<b>cid=1</b>
You can retrieve a Custom Print Report of a record by appending .carbone? to the URL, along with the following parameters (joined with &).
https://www.ragic.com/demo/sales/1/41.carbone?fileFormat=pdf&ragicCustomPrintTemplateId=1&fileNameRefDomainId=1001000
(1) File format syntax: fileFormat="file format" (e.g., pdf, png, docx). Example: fileFormat=pdf (2) Custom template ID syntax: ragicCustomPrintTemplateId="Template ID". Example: ragicCustomPrintTemplateId=1 To obtain the "Template ID", first manually download the Custom Print Report and find the Template ID parameter in the download URL:
https://www.ragic.com/demo/sales/1/41.carbone?fileFormat=pdf&fileNameRefDomainId=-1&<b>ragicCustomPrintTemplateId=2</b>
(3) File name referenced field syntax (Optional):fileNameRefDomainId="Field ID". Example: fileNameRefDomainId=1001000
You can retrieve an HTML printer friendly version by adding .xhtml to the end of the record URL.
Example:
https://www.ragic.com/demo/sales/1/41.xhtml
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| rootNodeId required | integer Example: 12345 The record ID from your URL (shown when viewing a single record) |
Get the PDF version of a record by adding .pdf to the end of the record URL.
Example:
https://www.ragic.com/demo/sales/1/41.pdf
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| rootNodeId required | integer Example: 12345 The record ID from your URL (shown when viewing a single record) |
Get the Excel version of a record by adding .xlsx to the end of the record URL.
Example:
https://www.ragic.com/demo/sales/1/41.xlsx
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| rootNodeId required | integer Example: 12345 The record ID from your URL (shown when viewing a single record) |
Mail Merge generates a document (e.g., a contract, invoice, or letter) from a template that fills in data from the record. Add .custom and a template ID (cid) to download the generated document.
To find the cid, manually download a Mail Merge document from the Ragic interface and look for the cid parameter in the download URL.
Example:
https://www.ragic.com/demo/sales/1/41.custom?cid=1
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| rootNodeId required | integer Example: 12345 The record ID from your URL (shown when viewing a single record) |
| cid required | integer Example: cid=1 |
If you are not using simple HTML forms to create entries on Ragic, you will need to create API requests to create the entries. The endpoints for writing to a form is the same as reading them, but you issue a POST request instead of a GET request. The API now supports JSON data, and it is the recommended way to make HTTP requests. To POST JSON data, you need to change Body settings to raw JSON, as the image below.
What you need to do is use the field ids of the fields as name, and the values that you want to insert as parameter values. Please note that your user will need write access to the form for this to work.
curl -F "2000123=Dunder Mifflin" \
-F "2000125=1-267-922-5599" \
-F "2000127=Jeff Kuo" \
-F "api=" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/sales/1
The equivalent JSON format is as below,
{
"2000123": "Dunder Mifflin",
"2000125": "1-267-922-5599",
"2000127": "Jeff Kuo",
}
If the field is a multiple selection that can contain multiple values, you can have multiple parameters with the same field id as names. If the field is a date field the value will need to be in the format of yyyy/MM/dd or yyyy/MM/dd HH:mm:ss if there's a time part. So a request would look like this:
curl -F "2000123=Dunder Mifflin" \
-F "2000125=1-267-922-5599" \
-F "2000127=Jeff Kuo" \
-F "1000001=Customer" \
-F "1000001=Reseller" \
-F "2000133=2018/12/25 23:30:00" \
-F "api=" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/sales/1
The equivalent JSON format is as below, the squre brackets for the field ID 1000001 allows for multiple values in one statement.
{
"2000123": "Dunder Mifflin",
"2000125": "1-267-922-5599",
"2000127": "Jim Halpert",
"1000001": ["Customer", "Reseller"],
"2000133": "2018/12/25 23:30:00"
}
If you would like to insert data into the subtables at the same time, you will need a slightly different format for the fields in the subtables because Ragic needs a way to determine if the field values belong to the same entry in a subtable. If the field values are in the same subtable row, assign them with the same negative row id with each other. It can be any negative integer. It's only a way to determine that they are in the same row.
2000147_-1=Bill
2000148_-1=Manager
2000149_-1=billg@microsoft.com
2000147_-2=Satya
2000148_-2=VP
2000149_-2=satyan@microsoft.com
The whole request would look like this:
curl -F "2000123=Dunder Mifflin" \
-F "2000125=1-267-922-5599" \
-F "2000127=Jeff Kuo" \
-F "1000001=Customer" \
-F "1000001=Reseller" \
-F "2000133=2018/12/25 23:30:00" \
-F "2000147_-1=Bill" \
-F "2000148_-1=Manager" \
-F "2000149_-1=billg@microsoft.com" \
-F "2000147_-2=Satya" \
-F "2000148_-2=VP" \
-F "2000149_-2=satyan@microsoft.com" \
-F 'api=' \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/sales/1
The equivalent JSON format is as below,
{
"2000123": "Dunder Mifflin",
"2000125": "1-267-922-5599",
"2000127": "Jim Halpert",
"1000001": ["Customer", "Reseller"],
"2000133": "2018/12/25 23:30:00"
"_subtable_2000154": {
"-1": {
"2000147": "Bill",
"2000148": "Manager",
"2000149": "billg@microsoft.com"
},
"-2": {
"2000147": "Satya",
"2000148": "VP",
"2000149": "satyan@microsoft.com"
}
}
}
If you would like to populate a file upload field , just make sure that the request encoding type is a multipart/form-data. The HTML equivalent would be setting enctype='multipart/form-data' With a multipart request, you can put the file in your request, and just put the file name as the field value.
1000088=test.jpg
To create entries via API instead of HTML forms, use a POST request (not GET) to the same endpoint used for reading.
The API now supports JSON data, and it is the recommended way to make HTTP requests.
Field IDs serve as parameter names, with desired values as the values. Users need write access to the form for this to function.
If the field is a date field the value will need to be in the format of yyyy/MM/dd or yyyy/MM/dd HH:mm:ss when time is included.
Example cURL request:
curl -F "1000001=New Order" \
-F "1000002=2024/01/15" \
-F "api=" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/sales/1
JSON equivalent:
{
"1000001": "New Order",
"1000002": "2024/01/15"
}
With subtable rows: When populating subtables simultaneously, field values in the same row must share identical negative row identifiers (any negative integer).
{
"1000001": "New Order",
"_subtable_1000010": {
"-1": {"1000011": "Item A", "1000012": 2},
"-2": {"1000011": "Item B", "1000012": 5}
}
}
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| doFormula | string Default: "false" Enum: "true" "false" Execute formulas after saving.
|
| doDefaultValue | string Default: "false" Enum: "true" "false" Apply default values for empty fields.
|
| doLinkLoad | string Default: "false" Enum: "true" "false" "first" Execute "Link & Load" operations. In Ragic, Link & Load automatically copies data from a linked record into the current record (e.g., selecting a customer auto-fills their address). By default the API skips this for performance.
|
| doWorkflow | string Default: "true" Enum: "true" "false" Trigger workflow actions (pre-workflow, post-workflow).
|
| notification | string Default: "true" Enum: "true" "false" Send notifications (email, approval notifications).
|
| info | string Include record metadata (who created/modified it and when). Useful for audit logs or sync operations.
|
| importData | string Import data from a URL into the sheet. Requires SYSAdmin privileges. Example: |
| tz | number Example: tz=-8 Timezone offset in hours for date/time fields. Example: Date values in the response will be adjusted to this timezone. |
| version | string Example: version=2025-01-01 API version using date-based versioning (recommended). Format: Using versioning ensures your integration remains stable when Ragic introduces breaking changes. The API will behave according to the version you specify. Example: |
| v | integer Enum: 1 2 3 Legacy API version number. Use
|
| api | string API key for authentication (alternative to HTTP Basic Auth). Example: |
| callback | string JSONP callback function name. Adding a callback function parameter will enclose the returned JSON object as an argument in a call to the callback function specified by you. This is particularly valuable when you're accessing our API using Javascript for cross domain ajax calls. Example: Response will be wrapped: |
additional property | string or number or object or Array of strings |
{- "1000001": "New Customer",
- "1000002": "2024-01-15",
- "1000003": "Active"
}{- "status": "SUCCESS",
- "rv": "12345",
- "ragicId": 12345
}Ragic supports using POST, PUT, and PATCH method to modify an entry. The endpoint for modifying an entry is the same as reading an existing entry. Notice that when you create an entry, the endpoint points to a Ragic sheet, but when you edit an entry, your endpoint will need an extra record id to point to the exact record.
https://www.ragic.com/<account>/<tab folder>/<sheet index><b>/<record id></record></b>?api
</sheet></tab></account>
All you need to provide is the field ids of the fields that you would like to modify to. If the field is a date field the value will need to be in the format of yyyy/MM/dd or yyyy/MM/dd HH:mm:ss if there's a time part.
curl -F "2000123=Dunder Mifflin" \
-F "2000127=Jim Halpert" \
-F "api=" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/sales/1<b>/3</b>
The equivalent JSON format is as below,
{
"2000123": "Dunder Mifflin",
"2000127": "Jim Halpert"
}
For subtables, it's a bit more tricky. Because Ragic will need to know which row that you're editing. So you will need to find the row id of the row that you're editing. This information can be found from an API call. As we mentioned in earlier chapter, the returned format for an entry with subtables look like this:
"_subtable_2000154": {
"0": {
"Contact Name": "Jeff Kuo",
"Title": "Technical Manager",
"Phone": "886-668-037",
"E-mail": "jeff@ragic.com",
...
...
},
"1": {
"Contact Name": "Amy Tsai",
"Title": "Marketing",
"Phone": "",
...
...
},
"2": {
"Contact Name": "Allie Lin",
"Title": "Purchasing",
...
...
In the subtable, 1 is the row id for the contact Amy Tsai, and 2 is the row id for the contact Allie Lin. With this row id, you can modify data in the subtable pretty much like how you create an entry with subtable data. You use the row id as the identifier following the field id. You only need to put in the fields that you want to modify:
2000147_1=Ms. Amy Tsai
2000148_1=Senior Specialist
2000148_2=Senior Manager
The whole request would be like this:
curl -F "2000123=Dunder Mifflin" \
-F "2000127=Jim Halpert" \
-F "2000147_1=Ms. Amy Tsai" \
-F "2000148_1=Senior Specialist" \
-F "2000148_2=Senior Manager" \
-F "api=" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/sales/1<b>/3</b>
The equivalent JSON format is as below,
{
"2000123": "Dwight Schrute",
"2000127": "Jim Halpert" ,
"_subtable_2000154": {
"29" :{
"2000147": "Ms. Amy Tsai",
"2000148": "Senior Specialist"
},
"30" :{
"2000148": "Senior Manager"
}
}
}
If you want to delete a subtable row, you can create a request like:
DELSUB_<subtable key>=<subtable row id>
</subtable></subtable>
The equivalent JSON format is as below,
_DELSUB_<subtable key>=[<subtable row id>,<subtable row id>,...,<subtable row id>];
</subtable></subtable></subtable></subtable>
For example, if you want to delete the contact Arden Jacobs, the whole request would be like this:
curl -F "DELSUB_2000154=3" \
-F "api=" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/sales/1<b>/3</b>
The equivalent JSON format is as below,
{
"_DELSUB_2000154": [3]
}
Using the JSON format for subtable row deletion allows you to specify multiple rows in a simple manner,
{
"_DELSUB_subtable key": [<subtable row id>,..., <subtable row id>]
}
</subtable></subtable>
The Ragic API supports POST, PUT, and PATCH methods to modify entries. When you edit an entry, your endpoint will need an extra record id to point to the exact record.
You only need to provide field IDs for fields you want to change. Date fields require yyyy/MM/dd or yyyy/MM/dd HH:mm:ss format.
Example cURL request:
curl -F "2000123=Dunder Mifflin" \
-F "2000127=Jim Halpert" \
-F "api=" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/sales/1/3
JSON equivalent:
{
"2000123": "Dunder Mifflin",
"2000127": "Jim Halpert"
}
Subtable Modifications:
For subtable rows, you must identify the row ID from API responses. The format uses fieldid_rowid notation.
{
"_subtable_2000154": {
"29": {
"2000147": "Ms. Amy Tsai",
"2000148": "Senior Specialist"
}
}
}
Deleting Subtable Rows:
To delete specific rows from a subtable, use _DELSUB_{subtableFieldId} with an array of row IDs to remove. Get the row IDs from a previous GET response.
{
"_DELSUB_2000154": [3]
}
Delete multiple rows at once: "_DELSUB_2000154": [3, 7, 12]
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| rootNodeId required | integer Example: 12345 The record ID from your URL (shown when viewing a single record) |
| doFormula | string Default: "false" Enum: "true" "false" Execute formulas after saving.
|
| doDefaultValue | string Default: "false" Enum: "true" "false" Apply default values for empty fields.
|
| doLinkLoad | string Default: "false" Enum: "true" "false" "first" Execute "Link & Load" operations. In Ragic, Link & Load automatically copies data from a linked record into the current record (e.g., selecting a customer auto-fills their address). By default the API skips this for performance.
|
| doWorkflow | string Default: "true" Enum: "true" "false" Trigger workflow actions (pre-workflow, post-workflow).
|
| notification | string Default: "true" Enum: "true" "false" Send notifications (email, approval notifications).
|
| checkLock | string Value: "true" Check if the record is locked before an update, and not edit the record if it is locked.
|
| lock | string Lock a record to prevent other users from editing it. Use this parameter with a POST request to the record endpoint. No request body is needed. Example: |
| unlock | string Unlock a previously locked record. Use this parameter with a POST request to the record endpoint. No request body is needed. Example: |
| bId | string Execute an action button on a record. Pass the button ID obtained from the Action Button Metadata endpoint. Example: |
| info | string Include record metadata (who created/modified it and when). Useful for audit logs or sync operations.
|
| tz | number Example: tz=-8 Timezone offset in hours for date/time fields. Example: Date values in the response will be adjusted to this timezone. |
| version | string Example: version=2025-01-01 API version using date-based versioning (recommended). Format: Using versioning ensures your integration remains stable when Ragic introduces breaking changes. The API will behave according to the version you specify. Example: |
| v | integer Enum: 1 2 3 Legacy API version number. Use
|
| api | string API key for authentication (alternative to HTTP Basic Auth). Example: |
additional property | string or number or object or Array of strings |
{- "1000003": "Completed",
- "1000004": "2024-01-20"
}{- "status": "SUCCESS",
- "rv": "string",
- "ragicId": 0,
- "msg": "string",
- "warning": "string"
}There are many useful parameters that you can use when creating or updating records on Ragic to save your time writing duplicate code for what can be done on Ragic.
| Parameter Name | Description |
|---|---|
| doFormula | Specifying doFormula=true tells Ragic API to recalculate all formulas first when a record is created or updated. Do note that if this is set to true, the workflow scripts that you configured on the sheet will not run to avoid infinite loops. |
| doDefaultValue | Specifying doDefaultValue=true tells Ragic API to load all default values when a record is created or updated. |
| doLinkLoad | Specifying doLinkLoad=true tells the Ragic API to recalculate all formulas first, and then execute all link and load operations when a record is created or updated. |
Specifying doLinkLoad=first tells the Ragic API to execute all link and load operations first, and then recalculate all formulas when a record is created or updated.
When using either of the above parameters and formula recalculation is required, you must also specify doFormula=true. | | doWorkflow | Specifying doWorkflow=true tells Ragic API to execute the workflow script associated with this API call. | | notification | Specifying notification=true tells Ragic API to send out notifications to relevant users, or false, otherwise. The default is true when not specified. | | checkLock | Specifying checkLock=true tells Ragic API to check if the record is locked before an update, and not edit the record if the record is locked. |
Deleting an entry is very similar to reading an entry. All you need to do is change the request method from GET to DELETE. When it's a DELETE request, the entry at the API endpoint will be deleted.
curl -X DELETE \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
-d "api" \
https://www.ragic.com/demo/sales/1/3

Delete a record by its ID.
Warning: This action cannot be undone.
Example:
curl -X DELETE \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
"https://www.ragic.com/demo/sales/1/12345?api"
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| rootNodeId required | integer Example: 12345 The record ID from your URL (shown when viewing a single record) |
| version | string Example: version=2025-01-01 API version using date-based versioning (recommended). Format: Using versioning ensures your integration remains stable when Ragic introduces breaking changes. The API will behave according to the version you specify. Example: |
| v | integer Enum: 1 2 3 Legacy API version number. Use
|
| api | string API key for authentication (alternative to HTTP Basic Auth). Example: |
{- "status": "SUCCESS"
}Make sure your content-type is multipart/form-data , and you will be able to upload files.
curl -F "1000088=@/your/file/path" \
-F "api=" \
-F "v=3" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/sales/1
After a success uploading, you will receive your file in this format.
"1000088": "Ni92W2luv@test.jpg",
Hover your mouse over the boxed area to expose the drop-down list, and select the "File" option to allow file uploads.
If you want to get files just uploaded, follow instruction here. If you want to upload files via link, download it first and then follow instruction above.
curl -o __TEMP_FILE__ YOUR_IMAGE_LINK
curl -F "1000002=@__TEMP_FILE__" -F "api=" -F "v=3" -H "Authorization:Basic YOUR_API_KEY" https://www.ragic.com/demo/sales/1
Remember to replace YOUR_IMAGE_LINK and YOUR_API_KEY You can find your API key in your Personal Settings page.
Make sure your content-type is multipart/form-data.
curl -F "at=@/your/file/path" \
-F "c=yourComment"
-F "api=" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/ragicsales-order-management/10001/2
In the request body, the value of the parameter c is the comment(required), and the value of the parameter at is the attachment(optional). You can find your API key in your Personal Settings page.
Response:
{
"61": "2025/02/13 14:30",
"65": "John Smith",
"66": "Please review this order.",
"67": "",
"73": "1739425800000"
}
Field 61 is the formatted timestamp, 65 is the commenter's name, 66 is the comment text, 67 is the attachment filename (empty if none), and 73 is the raw timestamp in milliseconds.
You must have SYSAdmin privileges to use this API. Before using this API, please enable the "Periodic Import from URL" feature. Once the setup is complete, you can trigger the import by calling the following API:
curl -F "importData="
-F "api=" \
-H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
https://www.ragic.com/demo/ragicsales-order-management/10001
When you need to create or update a large amount of data , you can also use this method to import all at once instead of making multiple API calls. You can find your API key in your Personal Settings page.
Response:
{
"status": "SUCCESS",
"msg": "Import completed."
}
To lock or unlock data using the HTTP API, simply append the query strings "api" and "lock"/"unlock" to the target record’s URL and send the request using the POST method.
curl -X POST https://www.ragic.com/demo/ragicforms23/10004/102?api&lock
curl -X POST https://www.ragic.com/demo/ragicforms23/10004/102?api&unlock
The permissions for locking/unlocking are the same as when performing the action through the form interface. You can find your API key in your Personal Settings page.
Response:
{
"status": "SUCCESS",
"code": 200
}
To execute an Action Button through the Http API, you first need to obtain the Action Button ID. Use the GET method to send the following request:
curl "https://{serverName}/{accountName}{path}/{sheetIndex}/metadata/actionButton?api&category=massOperation" \
-H "Authorization: {Basic apiKey}"
After obtaining the Action Button ID , you can use the POST method to send the following request and execute the specified Action Button on the target record:
curl -X POST "https://{serverName}/{accountName}{path}/{sheetIndex}/{recordId}?api&bId={buttonId}" \
-H "Authorization: Basic apiKey"
Note: In addition to having permission to execute the Action Button, you must also have permission to view the target record in order to use this Http API. You can find your API key in your Personal Settings page.
Response:
{
"status": "SUCCESS",
"msg": "Action completed."
}
Retrieve a list of action buttons configured on a form/sheet.
Use the optional category=massOperation parameter to filter for buttons that support mass operations.
Example:
curl -H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
"https://www.ragic.com/demo/sales/1/metadata/actionButton?api"
Filter for mass operation buttons:
curl -H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \
"https://www.ragic.com/demo/sales/1/metadata/actionButton?api&category=massOperation"
Response:
[
{"id": "btn_001", "name": "Send Notification"},
{"id": "btn_002", "name": "Generate Report"}
]
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| category | string Value: "massOperation" |
| api | string API key for authentication (alternative to HTTP Basic Auth). Example: |
[- {
- "id": "btn_001",
- "name": "Send Notification"
}, - {
- "id": "btn_002",
- "name": "Generate Report"
}
]If the request returned in error, it will look something like this:
{
"status": "ERROR",
"code": 303,
"msg": "Your account has expired."
}
Here is a list of the HTTP status code that might be returned on a Ragic request:
| HTTP Status | Description |
|---|---|
| 200 | OK - Everything worked as expected. |
| 400 | Bad Request - Often missing a required parameter. |
| 401 | Unauthorized - No valid API key provided. |
| 402 | Request Failed - Parameters were valid but request failed. |
| 404 | Not Found - The requested item doesn't exist. |
| 500, 502, 503, 504 | Server errors - something went wrong on Ragic's end. |
If there was an error processing your request, it will generally contain an error code and a description. Here is the list of error codes that you might receive as a response to a Ragic request:
| Error Code Id | Error Description |
|---|---|
| 101 | Invalid Account Name: {Account_Name} |
| 102 | Invalid Path: {Path} |
| 103 | Invalid Form Index: {Form_Index} |
| 104 | Cannot POST Data To A Custom Form |
| 105 | Authentication Required Before Using API |
| 106 | No Access Right |
| 107 | Resource Bundle Not Found |
| 108 | Error Loading Requested Form |
| 109 | Cannot Create More Records |
| 201 | Error Processing Request Parameters |
| 202 | Error Executing Request |
| 203 | POST Request Did Not Finish |
| 204 | Request Frequency Too High |
| 301 | Sid Parameter / Session Has Timed Out |
| 303 | Account Expired |
| 304 | Secret Key Is Invalid |
| 402 | Record Locked |
| 404 | Record Not Found |
Mass operation APIs are designed to perform the same set of operations for multiple records on a sheet in one single request. There are two ways of specifying the records to be updated:
https://www.ragic.com/< account >/< tab folder >/< sheet index >/massOperation/< Mass Operation Type >?api&where=< Field ID >,< Filter Operand >,< Value >
https://www.ragic.com/< account >/< tab folder >/< sheet index >/massOperation/< Mass Operation Type >?api&recordId=< recordId >
HTTP Method - POST
URL - https://www.ragic.com/< account >/< tab folder >/< sheet index >/massOperation/< Mass Operation Type >?api
Headers
Authorization: Basic < API Key >
Body
{
// JSON data that describes the operation to be performed
}
==========
Response
{
"taskId": < A UUID That Identifies The Task >
}
The mass lock API allows locking or unlocking multiple records at once. Mass Lock Document
HTTP Method - POST
URL - https://www.ragic.com/< account >/< tab folder >/< sheet index >/massOperation/massLock?api
{
"action": < lock or unlock >
}
==========
Response
{
"taskId": "6dbc796a-07d5-475b-b578-d254eb30f7d2"
}
The mass approval API allows approval or rejection of multiple records at once. Mass Approval Document
HTTP Method - POST
URL - https://www.ragic.com/< account >/< tab folder >/< sheet index >/massOperation/massApproval?api
{
"action": < approve or reject >,
"comment": < optional comment > // optional
}
==========
Response
{
"taskId": "6dbc796a-07d5-475b-b578-d254eb30f7d2"
}
The mass action button API allows the execution of an action button on multiple records at once. Mass Action Button Document
HTTP Method - POST
URL - https://www.ragic.com/< account >/< tab folder >/< sheet index >/massOperation/massActionButton?api
{
"buttonId": < button ID >
}
==========
Response
{
"taskId": "6dbc796a-07d5-475b-b578-d254eb30f7d2"
}
To Fetch The List Of Available Action Buttons On A Sheet
HTTP Method - GET
URL - https://www.ragic.com/< account >/< tab folder >/< sheet index >/metadata/actionButton?api&category=massOperation
==========
Response
{
"actionButtons": [
{
"id": < button ID 1 >,
"name": < button name 1 >
},
.....
,{
"id": < button ID 2 >,
"name": < button name 2 >
}
]
}
The mass update API allows updates of field values on multiple records at once. Mass Update Document
HTTP Method - POST
URL - https://www.ragic.com/< account >/< tab folder >/< sheet index >/massOperation/massUpdate?api
{
"action": [
{
"field": < Field ID >,
"value": < New Field Value >
}
]
}
==========
Response
{
"taskId": "6dbc796a-07d5-475b-b578-d254eb30f7d2"
}
The mass update API also supports using on Internal Users and External Users, but there are some restrictions.
The following fields cannot be mass updated:
Mass updating Ragic Groups (domainId: 3) has to follow the rules below:
HTTP Method - POST
URL - https://www.ragic.com/< account >/< tab folder >/< sheet index >/massOperation/massUpdate?api
{
"action": [
{
"field": 3,
"value": "[\"SYSAdmin\"]"
}
]
}
==========
Response
{
"taskId": "6dbc796a-07d5-475b-b578-d254eb30f7d2"
}
The mass search and replace API allows value replacement on multiple records at once. Mass Search And Replace Document
HTTP Method - POST
URL - https://www.ragic.com/< account >/< tab folder >/< sheet index >/massOperation/massSearchReplace?api
{
"action": [
{
"field": < Field ID >,
"valueReplaced": < Value To Be Replaced >,
"valueNew": < Value To Replace With >,
}
]
}
==========
Response
{
"taskId": "6dbc796a-07d5-475b-b578-d254eb30f7d2"
}
Mass operations are asynchronous operations. The task Id of the operation can be used to monitor its progress.
HTTP Method - GET
URL - https://www.ragic.com/< account >?api&taskId=< task ID >
==========
Response
{
"id": "6dbc796a-07d5-475b-b578-d254eb30f7d2",
"ap": "myaccount",
"taskName": "Mass Update",
"status": "PROCESSING",
"processed": 50,
"success": 48,
"fail": 2,
"message": ""
}
The status field can be NOT_STARTED, PROCESSING, or DONE. The processed, success, and fail fields indicate the number of records handled so far.
Execute a bulk operation on multiple records at once. All mass operations are asynchronous and return a taskId that can be used to check progress.
Record Selection: Use the where query parameter or recordId query parameter to select which records to operate on.
Operation Types:
Update field values across multiple records.
{
"1000001": "New Value",
"1000002": "2024/06/01"
}
Search for text in a field and replace it across multiple records.
{
"fieldId": "1000001",
"search": "old text",
"replace": "new text"
}
Lock or unlock multiple records.
{"lock": true}
Approve or reject multiple records at once.
{"action": "approve"}
Execute an action button across multiple records.
{"bId": "btn_001"}
Response:
{"taskId": "550e8400-e29b-41d4-a716-446655440000"}
Use the taskId with the List Records endpoint to check progress.
| apname required | string Example: myaccount Your account name (the subdomain in your Ragic URL, e.g., "demo" in www.ragic.com/demo/...) |
| path required | string Example: sales The folder path from your URL (e.g., "sales" or "hr/employees") |
| sheetIndex required | integer Example: 1 The sheet number from your URL (the number after the folder path) |
| operationType required | string Enum: "massUpdate" "massSearchReplace" "massLock" "massApproval" "massActionButton" |
| where | Array of strings Examples:
Filter condition with comma-delimited arguments. Format: Available Operands:
Multiple "eq", "regex", or "like" conditions on the same field act as OR operations. Combining gte/gt and lte/lt conditions on the same field creates AND operations (useful for date ranges). Date/datetime values must use format: Empty value filtering: leave third argument blank, e.g., Commas in filter values require URL encoding ( Double URL encoding: If a filter value contains Example: |
| recordId | Array of integers |
| api | string API key for authentication (alternative to HTTP Basic Auth). Example: |
| property name* additional property | any |
{- "1000001": "New Value",
- "1000002": "2024/06/01"
}{- "taskId": "550e8400-e29b-41d4-a716-446655440000"
}Webhook is a way for your external application to subscribe to changes to your Ragic application. By subscribing to the changes, whenever a change is made on Ragic, Ragic will call the Webhook URL you provided to notify you of the change, including the ID of exact record that has been changed. The biggest advantage of using a webhook API instead of a RESTful API, is that it is a lot more efficient in processing changes. You no longer have to poll the API every X hours to watch for latest changes.
You can find webhook for a sheet on Ragic by clicking on the Tools button at the top. You will find the webhook in the Sync section.
Things to note on the webhook API:
Click on the “webhook” feature and enter the URL that should receive this notification, and you’re done. You can also opt in to receive full information on the modified data by checking the checkbox "send full content on changed record". To cancel the webhook configuration, click on the x in the corner of the webhook configuration box. The JSON format without full content would look like
[1 ,2 ,4]
For this example, it means entries with node ID 1 & 2 & 4 were changed. The JSON format with full content would look like
{
"data": [
< THE MODIFIED DATA ENTRY IN JSON >
]
"apname": "< ACCOUNT NAME >",
"path": "< PATH NAME >",
"sheetIndex": < SHEET INDEX >,
"eventType": "< EVENT TYPE CREATE/UPDATE/DELETE >"
}
You can also choose the types of events you want to trigger the webhook. We provide the following options: Trigger on new entry , Trigger on entry update , Trigger on entry deletion. Example of Trigger on new entry :
(Note: since other unmodified records are also saved here, this will generate a large number of Trigger on entry update)
Example of Trigger on entry update :
(Note: since other unmodified records are also saved here, this will generate a large number of Event: update)
Example of Trigger on entry deletion :
To ensure that the Webhook request truly comes from Ragic and that its content has not been tampered with, Webhooks configured as "Send full content of changed record." will include a signature in the request. After receiving the Webhook, you can use the public key we provide to verify the signature. If verification fails, it means the request may have been tampered with, and it is recommended to reject processing.
1.1. Extract the data property from the Webhook request. (The data property should be in JSONArray format) 1.2. Serialize it into a JSON string with keys sorted alphabetically , no indentation , and no line breaks. In other words, "for each object in the JSONArray, reorder all fields alphabetically, then output as a single-line JSON".
// Before conversion (original data property):
[
{
"1001030":"banana",
"1001029":"apple"
}
]
// After conversion (string-to-sign):
[{"1001029":"apple","1001030":"banana"}]
Note: If the serialization method is inconsistent with ours, the signature verification will fail.
2.1. Extract the signature property from the Webhook request. 2.2. Download the public key (see "Get Public Key"). 2.3. Use a verification tool that supports SHA256withRSA.
2.4. If verification succeeds, it means the request is from Ragic and its content has not been tampered with.
We provide two ways for you to obtain the public key. Choose the one that best fits your use case:
It is recommended to cache the public key on your server and only re-download it on startup.